template<typename T>
struct A{
void method1(){}
};
template<>
struct A<int>{
void method2(){}
};
Will A<int>
方法1和方法2都有吗?和A<float>
只会有method1
?
每个专业化都会带来一种全新的数据类型(或者一个全新的模板,如果专业化只是部分的)。来自标准 (C++11):
(§14.5.5/2) 每个类模板部分特化都是一个不同的模板,并且应为模板部分特化的成员提供定义 (14.5.5.3)。
And:
(§14.5.5.3/1) [...] 类模板部分特化的成员与主模板的成员无关。应定义以需要定义的方式使用的类模板部分特化成员;主模板成员的定义永远不会用作类模板部分特化成员的定义。 [...]
上述内容是在上下文中陈述的partial专业化,但它也适用于显式专业化(如您的情况),尽管标准没有明确说明这一点。
另请注意,您不仅需要在特化中声明所需的所有成员函数,而且还需要定义它们(这里,标准甚至对于显式特化也非常清楚):
(14.7.3/5) 显式专用类的成员不会从类模板的成员声明中隐式实例化;相反,如果需要定义类模板特化的成员,则应显式定义其本身。在这种情况下,类模板显式特化的定义应在范围内
在定义成员时。显式特化类的定义与生成的特化的定义无关。也就是说,其成员不需要与生成的专业化的成员具有相同的名称、类型等。 [...]
所以,确实,A<int>
只会有method2()
, and A<float>
只会有method1()
作为会员。此外,如果你要介绍method1()
in the A<int>
也专业化,它不需要具有相同的参数类型或返回类型A<float>::method1()
.
请参阅 @aschepler 的答案,了解避免重写模板定义的可能方法int
case.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)