具有继承的模板如何显式调用其父的构造函数?

时间:2017-01-24 18:02:40

标签: c++ templates inheritance

如果我有玩具类继承,如:

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}}构造函数?实际上,如果我用

调用g ++ 5.2.1
Parent<ModelT>(i)

我收到以下错误:

g++ -std=c++14 ~/tmp.cpp

3 个答案:

答案 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);
}

您的代码存在两个主要问题。

  1. 访问说明符。 C ++中类的默认访问说明符是私有的,因此Parent类对Parent构造函数不可见。如果我们向Parent添加一个public或protected的说明符,那么类Child将能够访问它。由于您尚未指定是否将创建父类对象,因此我认为最好小心谨慎并使用受限制的受保护访问说明符。

  2. 模板类 模板类的类型包括模板类型说明符。 在原始代码中,它缺少几个地方。

答案 2 :(得分:2)

对于简单的情况,只需提供正确的基类:

Child(int i) : Parent<ModelT>(i) { }

对于基类太复杂而无法键入的情况,您可以使用父类的注入类名。它就在那里,只是非限定名称查找不会在依赖的基类中查找。但你可以获得资格:

Child(int i) : Child::Parent(i) { }
               ~~~~~~~