我有一个嵌套在另一个模板中的类模板。部分特化它很容易:我只是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 > {};
(我把我所有的非工作代码都留在了;适当地评论它以试图理解。)