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

Edw*_*nge 5 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; };
Run Code Online (Sandbox Code Playgroud)

这很好用.如果我改为像这样指定内部模板,它不会:

template < typename T0 >
template < >
struct outer<T0>::inner<double,void> { typedef int type; };
Run Code Online (Sandbox Code Playgroud)

为此,我得到错误消息,"'''令牌之前的无效显式专门化......封闭类模板没有明确专门化......模板参数未在部分特化中使用:... T0".不确定WTAF会在这里发生.

我也试过这个:

template < typename T0 >
struct outer<T0>::inner<double,void> { typedef int type; };
Run Code Online (Sandbox Code Playgroud)

我预计这会失败,错误信息也就不足为奇了.它是:"模板参数列表太少".

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

And*_*owl 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();
Run Code Online (Sandbox Code Playgroud)

- 结束例子 ]