根据[temp.class.spec] 5 /(强调我的)
可以声明或重新声明类模板部分特化 在任何命名空间范围中对应的主模板可以 定义
这表明部分特化(就像显式特化一样)必须出现在命名空间范围内。这实际上是通过段落下面的例子证实的:
template<class T> struct A {
struct C {
template<class T2> struct B { };
};
};
// partial specialization of A<T>::C::B<T2>
template<class T> template<class T2>
struct A<T>::C::B<T2*> { };
//...
A<short>::C::B<int*> absip; // uses partial specialization
另一方面,C++ Standard Core Language Active Issues No 727示例表明,课堂内部分专业化很好:
struct A {
template<class T> struct B;
template <class T> struct B<T*> { }; // well-formed
template <> struct B<int*> { }; // ill-formed
};
我确定核心问题文档在这里是正确的,但找不到适当的参考来确认。你能救我吗?
答案 0 :(得分:1)
意图是有效 - 请参阅N4090:
在Issaquah 2014中简要讨论了DR 1755 7 和DR 727 8 之后,并基于对核反射器 9 的讨论 10 11 ,似乎Core正在融合以下成员模板及其专业化规则:部分专业化和显式专业化可以是第一个 声明在 最里面封闭的范围或封闭 命名空间范围(认识到明确声明特化) 不构成向一个类添加成员,因此可以完成 在闭幕后)。
7 http://www.openstd.org/jtc1/sc22/wg21/docs/cwg_toc.html#727
8 http://www.openstd.org/jtc1/sc22/wg21/docs/cwg_toc.html#1755
9 http://accu.org/cgibin/wg21/message?wg=core&msg=24366(24033,24290,24309,24368)
10 http://accu.org/cgibin/wg21/message?wg=core&msg=24731(24731,24732,24736,24738)
11 http://accu.org/cgibin/wg21/message?wg=core&msg=25168(25168-25179)
我提出了一个核心问题,因为我觉得目前的措辞不够明确;您引用的段落可以解释为禁止类内部分特化。
答案 1 :(得分:1)
该规范称为14.5.2p1
可以在类或类模板中声明模板;这样的模板称为成员模板。
并且在14.5.5p2
每个类模板部分特化是一个独特的模板,应为模板部分特化的成员提供定义
因此,类模板部分特化是一个模板,它是自然的,因为它仍然具有不固定的参数,因此它表示“类族”。模板可以在类或类模板中声明。