Specializing inner template with default parameters

五迷三道 提交于 2019-12-10 14:55:00

问题


I'm having trouble specializing an inner template when it's parameters are all known. Here's an example:

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

This works just fine. If I instead specify the inner template like so, it does not:

template < typename T0 >
template < >
struct outer<T0>::inner<double,void> { typedef int type; };

For this I get the error message, "invalid explicit specialization before ‘>’ token...enclosing class templates are not explicitly specialized...template parameters not used in partial specialization:...T0". Not sure WTAF is going on here.

I also tried this:

template < typename T0 >
struct outer<T0>::inner<double,void> { typedef int type; };

I expected this to fail and the error message is not surprising. It was: "too few template-parameter-lists".

So, what's the correct way to do this? I can of course hack around it, but if I don't have to I'd prefer not.


回答1:


That is not allowed. You cannot fully specialize a member of a class template that has not been itself fully specialized.

Per paragraph 14.7.16 of the C++11 Standard:

In an explicit specialization declaration for a member of a class template or a member template that appears in namespace scope, the member template and some of its enclosing class templates may remain unspecialized, except that the declaration shall not explicitly specialize a class member template if its enclosing class templates are not explicitly specialized as well. [...]

Also, paragraph 14.7.3/15 of the C++11 Standard says:

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 ]



来源:https://stackoverflow.com/questions/17129543/specializing-inner-template-with-default-parameters

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!