微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在模板化类中构造对象所需的异常初始化

如何解决在模板化类中构造对象所需的异常初始化

我有一些结构如下的代码

enum class Type {a,b,c,d};


template<typename T>
class External {
    public:
        External(Type t) {

        }
};


template<typename T>
class Base {};

template<typename T>
class Derived : Base<T> {
    public:
    private:
        External<int> e(Type::a);
};


int main() {
    Derived<int> der;

    return 0;
}

使用 g++ 编译时,会出现以下错误

<source>:49:25: error: 'Type::a' is not a type
   49 |         External<int> e(Type::a);
      |                         ^~~~

通过一些实验,我发现如果我以不同的方式构造 External 类型的对象,它会起作用:

template<typename T>
class Derived : Base<T> {
    public:
    private:
        External<int> e = External<int>(Type::a);
};

为什么会这样?为什么编译器在第一种情况下需要一个类型?

解决方法

编译器试图将 e 解释为成员函数,因此它试图将 Type::a 视为一种类型。

对于 default member initializer,您只能使用花括号初始化列表或等号初始值设定项(如您所示)。

通过一个默认成员初始值设定项,它是包含在成员声明中的大括号或等号初始值设定项,并且在构造函数的成员初始值设定项列表中省略该成员时使用。

template<typename T>
class Derived : Base<T> {
    public:
    private:
        External<int> e{Type::a};
};

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。