Явная спецификация вложенного класса: другое поведение компилятора

Следующий код компилируется нормально с Clang ++ 6.0.0 а также g ++ 7.3.0 (флаги компиляции -std=c++14 -Wall -Wextra -Werror -pedantic-errors) но не компилируется с vc ++ 19.10.25017 (флаг компиляции /Za):

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) ‘: явная специализация требует’ шаблона <>»

Какое поведение соответствует стандарту в этом случае?

9

Решение

VC ++ не так. Потенциально неправильно воспринимать следующий пункт:

Члены явно специализированного шаблона класса определены в
так же, как члены обычных классов, и не используя template<>
синтаксис. То же самое верно при определении члена явно
специализированный членский класс (*). Тем не мение, template<> используется при определении члена явно специализированного шаблона класса члена, который специализируется как шаблон класса.

Целью последнего правила является устранение неоднозначности:

// Which template does this header appertain to?
template<class U> void A<short>::C<U>::f() { /* ... */ }

Тем не менее, в вашем случае (*) применяется.

4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector