哪些成员是从模板参数继承的

时间:2016-11-11 18:14:05

标签: c++ inheritance class-template

如果我们有类似

的类模板
template<class Type>
class Field {
....
}; 

现在,如果我将类Field的对象声明为

Field <vector> velocityField;

所以哪些成员函数从vector继承到velocityField

1 个答案:

答案 0 :(得分:2)

当编译器找到具体类型的声明时,模板参数允许编译器执行泛型模板参数本身的替换。你没有继承任何东西。

如果在Type类的某处使用Field,则会相应地执行替换,并且编译器只会查找引用的方法。

template<class Type>
class Field {
  void Foo()
  {
    Type instanceOfType;
    instanceOfType.clear();
  }
  void NeverCalledMethod()
  {
     Bar(); //bar doesn't exist
  }
}; 

Field<vector> aField; // here the type Field<vector> is instantiated for the first time.
aField.Foo(); // only here the template class Foo() method is included by the compiler.

在某些情况下(例如Bar()的正文具有有效的语法),如果Bar()从未调用过编译,则编辑不会受到正文错误的影响。 因为Bar()它从未被调用,并且编译器可以解析它但不会尝试实际编译它,上面的代码不会产生任何编译器错误。