5

当它的参数都是已知的时,我无法专门化一个内部模板。这是一个例子:

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; };

我预计这会失败,错误消息并不奇怪。它是:“模板参数列表太少”。

那么,这样做的正确方法是什么?我当然可以破解它,但如果我不必这样做,我宁愿不要。

4

1 回答 1

7

这是不允许的。您不能完全特化本身尚未完全特化的类模板的成员。

根据 C++11 标准的第 14.7.16 段:

在类模板的成员或出现在命名空间范围内的成员模板的显式特化声明中,成员模板和它的一些封闭类模板可能保持未特化,除非声明不应显式特化类成员模板,如果它封闭类模板也没有明确专门化。[...]

此外,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();

—<em>结束示例]

于 2013-06-16T02:10:01.857 回答