模板类方法不会导致错误——这是标准的一部分
Template class method does not cause error -- is this part of the standard?
当我用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,当引用专门化时,成员的专门化被隐式实例化在需要成员定义存在的上下文中。。。
相关文章:
- C++11 标准中的哪一部分规定了基元数据类型大小之间的相对顺序?
- 从另一个常量标准::映射初始化一个常量标准::映射的一部分
- 为什么std :: nullopt_t的一部分是C 标准的一部分
- 标准的哪一部分决定了现场成员与初始化器列表的优先级
- 虚拟表是C++标准的一部分吗?
- C 标准的哪一部分涵盖通过空指针调用方法
- fabsf 是 C++11 中标准命名空间的一部分吗?
- 内联asm是ANSI C标准的一部分吗
- C 标准的哪一部分要求set ::擦除呼叫灾难源
- 是标准的一部分
- 模板类方法不会导致错误——这是标准的一部分
- strcpy_s是C++标准的一部分吗?或者只是MS Visual C++的一部分
- 模板模板模板参数是扩展还是标准的一部分
- 线程是标准C++的一部分
- "polymorphic base class"是C++标准的一部分吗?
- 值初始化是 C++98 标准的一部分吗?如果不是,为什么在 C++03 标准中添加它
- wcslen 是 ISO/IEC 14882:2003 C++标准库的一部分吗?
- #import C++11 标准的一部分
- boost Range库将成为下一个c++标准的一部分吗?
- 模板模板参数何时成为标准的一部分?