在目前的C++标准草案中,[temp.expl.spec]第18页一段说:
非专门化类模板的成员函数模板、成员类模板或静态数据成员模板的专门化本身就是模板。
然而,上面这一段tem.ex.specp.17(http://eel.is/c++draft/temp.expl.spec#17)指出(我的重点):
在出现在命名空间范围中的类模板或成员模板的成员的显式专门化声明中,成员模板及其一些封装类模板可能仍然是非专门化的,,除非声明不显式地专门化类成员模板,如果其封装类模板也不是显式专门化的话,。..。
因此,如果不专门化成员模板,那么就不可能显式地专门化成员模板,因此是错误的。我显式地突出了这个词,因为tem.ex.specp.18写着“一个专门化.”。专业化可以有很多含义,其中之一可以是明确的专业化。
我检查了,并在tem.ex.specp.17之前在标准中出现了tem.ex.specp.18。例如,在1996年版本的标准中,tem.ex.specp.18是存在的,而tem.ex.specp.17则不存在。
18的最初意图是什么?
谢谢。
发布于 2018-06-07 01:13:03
可以对非专门类模板的成员类模板进行部分专门化。
您的第17点禁止这样的成员完全专业化;第18点澄清了在这种情况下的部分专门化仍然是一个模板。
“明确专业化”一词指的是完全专业化,而不包括部分专业化。
template<typename T>
struct A
{
template<typename U, typename V>
struct B
{
void f() {}
};
};
// OK: Partially specialize A<T>::B. This is a template
template<typename T>
template<typename U>
struct A<T>::B<U, int>
{
void g() {}
};https://stackoverflow.com/questions/49949416
复制相似问题