2016-01-19 73 views
2

因此,让我们一例子:当一个类模板被实例化时,成员模板声明是否也被实例化?

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; } 

请问上述class foo<int>实例化成员模板声明bar即使成员本身就是模板的实例?任何标准的参考将非常感谢。

+1

你问,如果无限'FOO ::酒吧'被实例化?答案是不。 – Jarod42

+0

@ Jarod42不,只是成员函数模板'bar'的声明 –

+0

发布代码不能编译 – jpo38

回答

1

答案是肯定的。

从C++ 11标准

引文,[temp.inst] [14.7.1]:

  1. ...
    类模板专业化的隐式实例导致的所述隐式实例 声明,但不包括类成员函数,成员类,成员范围成员枚举,静态数据成员和成员模板的定义,默认参数或异常规范;它会导致unspecified成员枚举和成员匿名联合的定义的隐式实例化。

第二部分有大约被实例化什么时候该成员模板定义一些更多的信息。 (它一般发生隐式,当它们用于:)

  • 除非类模板或构件模板的成员已被显式实例或明确 专业化,专业化的当需要成员定义存在的上下文中引用特化时,该成员被隐式实例化;特别是静态数据成员的初始化(以及任何相关联的 副作用)不会发生,除非静态数据成员本身以需要定义静态数据成员存在的方式使用 。