template<typename T>
class C
{
void f() { }
};
/*template<typename T>
void C<T*>::f() { }*/
template<>
void C<int*>::f() { }
如果我们删除注释,代码将无法编译。我知道这一点(而且我也知道,我们应该有 partial specialization
代表 C<T*>
),但我找不到标准的词来解释这种行为。我重读了14 par
标准的几次。你能给我一个报价或部分标准来解释这个吗?
编辑。
template<typename T>
class C
{
template<typename U>
struct S { };
};
// #1
/*template<typename T>
class C<T*>
{
template<typename U>
struct S { };
};*/
// #2
/*template<typename T>
template<typename U>
struct C<T*>::S<U*> { };*/
template<>
template<typename U>
struct C<int*>::S<U*> { };
如果我们接下来只删除注释,那么 #2 - 代码将无法编译。
最佳答案
这是从 14.7.3/1 开始明确专门化的内容的标准引用:
An explicit specialization of any of the following:
— function template
— class template
— member function of a class template
— static data member of a class template
— member class of a class template
— member enumeration of a class template
— member class template of a class or class template
— member function template of a class or class template
can be declared by a declaration introduced by
template<>;
除非明确允许,否则您不能部分特化任何东西,并且不明确允许类模板的成员函数。只有类模板可以部分特化(如 14.5.5 中所述)。
(请注意,显式特化类模板的成员类模板本身就是一个类模板。)
关于c++ - 成员模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12340105/