当内部模板的参数全部已知时,我在专门化内部模板时遇到困难。这是一个例子:
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; };
为此,我收到错误消息“‘>’标记之前的显式专业化无效...封闭类模板未显式专业化...部分专业化中未使用模板参数:...T0”。不确定这里发生了 WTAF。
我也尝试过这个:
template < typename T0 >
struct outer<T0>::inner<double,void> { typedef int type; };
我预计这会失败,并且错误消息并不令人意外。它是:“模板参数列表太少”。
那么,这样做的正确方法是什么?我当然可以绕过它,但如果不需要,我宁愿不这样做。
这是不允许的。您无法完全特化本身尚未完全特化的类模板的成员。
根据 C++11 标准第 14.7.16 段:
在类模板的成员或出现的成员模板的显式专业化声明中
在命名空间范围内,成员模板及其一些封闭类模板可能会保留
非专业化,除了声明不应显式地特化类成员模板(如果其封闭)
类模板也没有明确专门化. [...]
此外,C++11 标准第 14.7.3/15 段说:
成员或成员模板可以嵌套在许多封闭类模板中。在明确的
对于此类成员的专业化,成员声明之前应有template<>
对于每个
包含明确专门化的类模板。 [Example:
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();
—结束示例 ]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)