如何解决在模板化类中构造对象所需的异常初始化
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 举报,一经查实,本站将立刻删除。