当内部模板的参数全部已知时,我无法专门化内部模板。这是一个例子:
template < typename T0 >
struct outer
{
template < typename T1 = void, typename T2 = void >
struct inner
{
typedef T1 type;
};
};
template < typename T0 >
template < typename T1 >
struct outer<T0>::inner<double,T1> { typedef int type; };
这很好用。如果我改为指定内部模板,那么它不会:
template < typename T0 >
template < >
struct outer<T0>::inner<double,void> { typedef int type; };
为此,我收到错误消息,“'&gt;'令牌之前的无效显式专门化...封闭类模板未明确专门化...模板参数未在部分专业化中使用:... T0”。不确定WTAF会在这里发生。
我也试过这个:
template < typename T0 >
struct outer<T0>::inner<double,void> { typedef int type; };
我预计这会失败并且错误消息并不令人惊讶。它是:“模板参数列表太少了。”
那么,这样做的正确方法是什么?我当然可以解决这个问题,但如果我没有,我宁愿不这样做。
答案 0 :(得分:7)
这是不允许的。您无法完全专门化一个尚未完全专业化的类模板的成员。
根据C ++ 11标准的第14.7.16段:
在显示的类模板成员或成员模板的显式特化声明中 在命名空间作用域中,可以保留成员模板及其一些封闭的类模板 unspecialized,,除非声明在封闭时不明确地专门化类成员模板 类模板也没有明确专门化。 [...]
此外,C ++ 11标准第14.7.3 / 15段说:
成员或成员模板可以嵌套在许多封闭的类模板中。在一个明确的 对于这样一个成员的专业化,成员声明前面应各有一个
template<>
包含明确专门化的类模板。 [示例:template<class T1> class A { template<class T2> class B { void mf(); }; }; template<> template<> class A<int>::B<double>; template<> template<> void A<char>::B<char>::mf();
- 结束示例]