У меня есть шаблон класса, вложенный внутри другого шаблона. Частично специализировать это легко: я просто объявляю еще один блок 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 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 > {};
(Я оставил весь свой нерабочий код, прокомментируйте его, чтобы попытаться понять).