C++ 实例化类模板时,是否也实例化了成员模板声明? 所以我们举个例子: template<typename T> struct foo { template<typename X> void bar(void (T::*)()) {} template<typename X> void bar(X*) {} template<typename X> void bar(T**) {} }; int main() { foo<int> p; } 模板结构foo { 模板无效条(无效(T::*)()){} 模板空栏(X*){} 模板空条(T**{} }; int main(){foop;}
上述C++ 实例化类模板时,是否也实例化了成员模板声明? 所以我们举个例子: template<typename T> struct foo { template<typename X> void bar(void (T::*)()) {} template<typename X> void bar(X*) {} template<typename X> void bar(T**) {} }; int main() { foo<int> p; } 模板结构foo { 模板无效条(无效(T::*)()){} 模板空栏(X*){} 模板空条(T**{} }; int main(){foop;},c++,templates,instantiation,C++,Templates,Instantiation,上述类foo的实例化是否会实例化成员模板声明条,即使成员本身是模板?任何来自标准的参考都将不胜感激。答案是肯定的 引用C++11标准[temp.inst][14.7.1]: … 类模板专门化的隐式实例化导致 声明,但不是类成员的定义、默认参数或异常规范的声明 函数、成员类、作用域成员枚举、静态数据成员和成员模板;和 它导致非作用域成员枚举和成员匿名联合定义的隐式实例化 第二部分详细介绍了成员模板定义的具体实例化时间。(当使用它们时,通常隐式发生:) 除非类模板或成员模板的成员已显式实例化或显式
类foo的实例化是否会实例化成员模板声明条
,即使成员本身是模板?任何来自标准的参考都将不胜感激。答案是肯定的
引用C++11标准[temp.inst][14.7.1]:
…
类模板专门化的隐式实例化导致
声明,但不是类成员的定义、默认参数或异常规范的声明
函数、成员类、作用域成员枚举、静态数据成员和成员模板;和
它导致非作用域成员枚举和成员匿名联合定义的隐式实例化
第二部分详细介绍了成员模板定义的具体实例化时间。(当使用它们时,通常隐式发生:)
除非类模板或成员模板的成员已显式实例化或显式
专门化,当在要求成员定义存在的上下文中引用专门化时,隐式实例化成员的专门化;特别是,初始化(以及任何相关的
静态数据成员的副作用)不会发生,除非静态数据成员本身以某种方式使用
这要求静态数据成员的定义存在
您是否询问是否实例化了无限foo::bar
?答案是否定的。@Jarod42否定,只是成员函数模板bar
Posted code的声明没有compile@jpo38它在编辑后编译。