La palabra clave 'plantilla' confunde MSVC

Una de esas preguntas sobre "qué compilador es el correcto" sobre las plantillas. Considere seguir:

template<typename T>
class Container
{
public:
    template<typename V>
    class iterator;
};

template<typename T>
template<typename V>
class Container<T>::iterator
{
public:
    iterator &operator++();
};

Ahora, al proporcionar una definición para eloperator++ fuera de línea se vería así:

template<typename T>
template<typename V>
typename Container<T>::template iterator<V> &Container<T>::iterator<V>::operator++()
{
    //do your thing
    return *this;
}

Y, efectivamente, prácticamente cualquier versión de GCC desde 4.8+ y Clang 3.2+ puede compilarlo. Sin embargo, MSVC19 + no lo hace y no le gusta específicamente eltemplate palabra clave en esa definición. Se queja de que no puede coincidir con la declaración y la definición, lo cual es especialmente divertido, ya que da lo que buscaba y el "candidato" y ambos son idénticos. Sitemplate se elimina tan solotypename Container<T>::iterator<V> se utiliza, MSVC lo compila muy bien. Sin embargo, Clang y GCC fallarán.

Puedes probarlo en vivo en Compiler Explorer:demo en vivo

Entonces, ¿quién tiene razón? Dado que tanto GCC como Clang tienen esto durante mucho tiempo, tiendo a inclinarme hacia ellos. Sin embargo, me gustaría apoyar a los tres. Entonces, o lo muevo a la definición en clase o uso#ifdef? Parece incorrecto y si MSVC está equivocado aquí, debe informarse (a menos que sea un problema conocido).

Respuestas a la pregunta(1)

Su respuesta a la pregunta