专门化成员模板而不专门化其父模板

Pot*_*ter 10 c++ templates partial-specialization

我有一个嵌套在另一个模板中的类模板.部分特殊化很简单:我只是template< … >在其父级中声明另一个块.

但是,我需要另一个部分特化,恰好指定其所有本地模板参数.这使它成为一个明确的专业化.无论出于何种原因,显式特化都必须在命名空间范围内.要在父类之外声明它,必须提名父级,这需要非空的模板参数列表.这意味着部分专业化.部分专业化我正在做的事情,它应该在任意外部范围内工作.但GCC和Comeau都无法使用部分特化形式参数识别父提名中的模板参数.

template< class X > struct A {
    template< class Y > struct B; // initial declaration OK

    template< class Z >
    struct B< A< Z > > {}; // partial OK as long as there's a local arg

    template<> // ERROR: this syntax triggers explicit specialization
    struct B< int > {};
};

template<> // ERROR: can't nest template<>s here (why?)
template< class X > // ERROR: can't deduce X from type of A<X>::B<int> (why?)
struct A< X >::B< int > {};
Run Code Online (Sandbox Code Playgroud)

(我把所有非工作代码都留下了;适当地评论以试图理解.)

小智 9

根据C++标准14.7.3/18,它是非法的:

....如果类成员模板的封闭类模板也没有明确专门化,则声明不应明确地专门化它.