【发布时间】:2018-04-14 14:44:43
【问题描述】:
在当前的 C++ 标准草案中,this paragraph 中有这个示例,属于与模板的显式特化相关的部分:
template<class T> struct A {
void f(T);
template<class X1> void g1(T, X1);
template<class X2> void g2(T, X2);
void h(T) { }
};
// specialization
template<> void A<int>::f(int);
// out of class member template definition
template<class T> template<class X1> void A<T>::g1(T, X1) { }
// member template specialization
template<> template<class X1> void A<int>::g1(int, X1); //(1)
// member template specialization
template<> template<>
void A<int>::g1(int, char); //(2)
在 (1) 中,g1 似乎更像是专门用于仍然是 A (A) 的专门版本中的函数模板,而在 (2) 中,g1 本身似乎专门用于自己设置的模板参数((int, from A), char)。
我发现这些专业化之间存在差异(再次,(1)感觉就像声明 g1 的新版本用于其“容器”A 的“特殊版本”,而(2 ) 感觉就像是关于 g1 本身(或关于它自己的模板参数)的专业化。
此外,考虑这个例子:
template<class T> struct A{
int f() { return 1; }
}
template<>
int A<int>::f() { return 2; } //(3)
对我来说,(1) 和 (3) 是同一种“特化”,与“容器”的特殊版本相关联,而 (2) 是实体(模板)本身的特化。
标准是否提到了这种差异,或者这两种专业化是否相同?
谢谢。
【问题讨论】:
-
它们不一样。
-
你能告诉我标准如何以及在哪里区分两者吗?
-
我不是语言律师。
(1)是部分特化,因为它仍然依赖于模板类型。(3)是一个专业。 -
也许我不应该从标准中选择示例。如果
g1被声明为:templatevoid g1(U);,我相信它们都会是明确的特化。
标签: c++ language-lawyer template-specialization