模板类方法不会导致错误——这是标准的一部分

Template class method does not cause error -- is this part of the standard?

本文关键字:标准 一部分 错误 类方法      更新时间:2023-10-16

当我用g++ --std=c++98 -Wall -Werror -Wpedantic Test.cc编译以下内容时,没有错误。

template <class T>
struct TemplateClass {
  T *ptr;
  TemplateClass(T *p): ptr(p) {}
  int foo() {
    return ptr->bar();
  }
};
struct ExampleClass {
};
int main() {
  TemplateClass<ExampleClass> x(new ExampleClass());
}

我预计编译器会抱怨ExampleClass没有实现方法bar

但是,如果我实际使用方法foo,它看起来只会抱怨。

在任何兼容C++98和C++11的编译器上,我都可以依赖这种行为吗?

我以前对模板的理解是,无论何时实例化模板,都会复制整个主体,并用模板参数替换T。模板不是这样工作的吗?

根据标准,这是正确的行为。foo的定义只有在需要其存在的上下文中使用时才会实例化。重点挖掘以下内容:

C++03,[温度指示]/1:

类模板专门化的隐式实例化导致类成员函数、成员类、静态数据成员和成员模板的声明实例化,而不是定义或默认参数的实例化;并且它导致了隐式实例化成员匿名工会的定义。除非类模板或成员模板的成员已显式实例化或显式专用化,否则该成员的专用化是隐式的在需要成员定义存在的上下文中引用专门化时实例化。。。

C++11,[温度指示]/1和[温度指示]2:

除非类模板专门化已经被显式实例化(14.7.2)或显式专门化(14.7.3),当在上下文中引用专门化时,类模板专门化被隐式实例化这需要一个完全定义的对象类型,或者当类类型的完整性影响程序的语义时。类模板专门化的隐式实例化导致类成员函数、成员类、作用域成员枚举、静态数据成员和成员模板的声明的实例化,而不是定义或默认参数的实例化。。。除非类模板或成员模板的成员已显式实例化或显式specialized,当引用专门化时,成员的专门化被隐式实例化在需要成员定义存在的上下文中。。。