在当前的C++标准草案中,与模板显式特化相关的章节中有这个例子,出现在此段落中。
在(1)中,
我认为这些特殊化之间存在差异(再次强调,(1)感觉像是声明
此外,请考虑以下示例:
对我而言,(1) 和 (3) 是同一种“专业化”,与一个特殊版本的“容器”有关,而 (2) 则是模板实体本身的专业化。
标准是否提到了这种区别,或者这两种专业化被称为相同的专业化?
谢谢。
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< int >)中仍然是一个函数模板,而在(2)中,g1
似乎是针对其自己的一组模板参数进行了特化((int,来自 A< int >),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)
是特化。 - Eljayg1
被声明为:template<class U> void g1(U);,我相信它们都将是显式特化。 - user42768