如果我有玩具类继承,如:
template <typename ModelT>
class Parent {
public:
Parent(int i) {}
};
template <typename ModelT>
class Child : public Parent<ModelT> {
public:
Child(int i) : Parent(i) {}
};
int main() {
Child<int> c(42);
}
如何明确调用Parent
的{{1}}构造函数?实际上,如果我用
Parent<ModelT>(i)
我收到以下错误:
g++ -std=c++14 ~/tmp.cpp
答案 0 :(得分:4)
问题是Parent
不是类型,它是类模板。为了使用它,你需要指定模板,以便它吐出一个实际的类类型,如:
Child(int i) : Parent<ModelT>(i) {}
答案 1 :(得分:3)
尝试
template <typename ModelT>
class Parent {
protected:
Parent(int i) {}
};
template <typename ModelT>
class Child : public Parent<ModelT> {
public:
Child(int i) : Parent<ModelT>(i) {}
};
int main() {
Child<int> c(42);
}
您的代码存在两个主要问题。
访问说明符。 C ++中类的默认访问说明符是私有的,因此Parent类对Parent构造函数不可见。如果我们向Parent添加一个public或protected的说明符,那么类Child将能够访问它。由于您尚未指定是否将创建父类对象,因此我认为最好小心谨慎并使用受限制的受保护访问说明符。
模板类 模板类的类型包括模板类型说明符。 在原始代码中,它缺少几个地方。
答案 2 :(得分:2)
对于简单的情况,只需提供正确的基类:
Child(int i) : Parent<ModelT>(i) { }
对于基类太复杂而无法键入的情况,您可以使用父类的注入类名。它就在那里,只是非限定名称查找不会在依赖的基类中查找。但你可以获得资格:
Child(int i) : Child::Parent(i) { }
~~~~~~~