template <typename>
struct A
{
template <typename>
struct B
{
};
};
template <>
template <>
struct A<int>::B<char>
{
static void foo();
};
void A<int>::B<char>::foo()
{
}
int main()
{
}
VC ++ сообщение об ошибке компиляции:
ошибка C2906: ‘void A<Int> :: B<char> :: foo (void) ‘: явная специализация требует’ шаблона <>»
Какое поведение соответствует стандарту в этом случае?
VC ++ не так. Потенциально неправильно воспринимать следующий пункт:
Члены явно специализированного шаблона класса определены в
так же, как члены обычных классов, и не используяtemplate<>
синтаксис. То же самое верно при определении члена явно
специализированный членский класс (*). Тем не мение,template<>
используется при определении члена явно специализированного шаблона класса члена, который специализируется как шаблон класса.
Целью последнего правила является устранение неоднозначности:
// Which template does this header appertain to?
template<class U> void A<short>::C<U>::f() { /* ... */ }
Тем не менее, в вашем случае (*) применяется.
Других решений пока нет …