使用默认参数特化内部模板

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”。不确定发生了什么。
我还尝试了以下方法:
template < typename T0 >
struct outer<T0>::inner<double,void> { typedef int type; };

我预料到这个会失败,错误信息并不令人惊讶。它是:"too few template-parameter-lists"。

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


相关内容:https://dev59.com/2Wox5IYBdhLWcg3wbDok?lq=1 - Nate Kohl
嗯...我确实进行了搜索,但没有找到。可能在这之前我没有献祭正确的山羊物种。 - Edward Strange
1个回答

7

不允许这样做。如果一个类模板的成员未被完全特化,则不能对其进行完全特化。

C++11标准第14.7.16段规定:

在命名空间作用域中出现的类模板成员或成员模板的显式具体化声明中,该成员模板及其一些封闭类模板可以保持未特化状态,但是如果其封闭类模板未被显式特化,则不能显式专门化类成员模板。[...]

此外,C++11标准第14.7.3/15段还指出:

A member or a member template may be nested within many enclosing class templates. In an explicit specialization for such a member, the member declaration shall be preceded by a template<> for each enclosing class template that is explicitly specialized. [ 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();

end example ]


这不是成员函数,但我想嵌套类型应该适用于同样的规则吧? - Nate Kohl
假设Nate是正确的。你能引用一下章节/节吗?03更好,但11也可以。 - Edward Strange
1
@CrazyEddie:是的,我在寻找一份报价。 - Andy Prowl
@CrazyEddie:我添加了对标准的引用。 - Andy Prowl
也许14.7.3/16更合适?(“...除非声明也不明确地专门化类成员模板,如果其封闭的类模板也没有明确地专门化。”) - Nate Kohl
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接