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).