使用默认参数专门化内部模板

时间:2013-06-16 02:06:37

标签: c++ templates specialization

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

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

我预计这会失败并且错误消息并不令人惊讶。它是:“模板参数列表太少了。”

那么,这样做的正确方法是什么?我当然可以解决这个问题,但如果我没有,我宁愿不这样做。

1 个答案:

答案 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();
     

- 结束示例]