Error del compilador en Visual C++ 10.0 SP1-cl.exe versión 16.0.40219.1 Violación de acceso
visual-c++ compiler-bug (2)
Actualización 2013-12-06: Microsoft ha confirmado el problema y el problema se solucionará en el compilador de Visual Studio 2013 C ++.
Me he encontrado con un problema al compilar algún código de plantilla con Visual Stuido 2010 SP1, cl.exe versión 16.0.40219.1
El siguiente código hará que el compilador acceda a violar:
template<typename T>
class A
{
A(){}
};
template<typename T>
class B : public A<T>
{
using A::A(); // Compiler access violates
// **EDIT**
//using A<T>::A<T>; // Compiler succeeds
//using A<T>::A(); // Compiler reports error
};
int main(int argc, char* argv[])
{
return 0;
}
Genera el siguiente error (además de que "cl.exe ha dejado de funcionar, excepción C0000005):
1>d:/projects/cpptest/cpptest/cpptest.cpp(11): fatal error C1001: An internal error has occurred in the compiler.
1> (compiler file ''msc1.cpp'', line 1420)
1> To work around this problem, try simplifying or changing the program near the locations listed above.
El código se compila bien (bueno, es decir, emite un mensaje de error adecuado y no bloquea el compilador) en Dev-C ++ con g ++.
main.cpp:11: error: `template<class T> class A'' used without template parameters
main.cpp:11: error: expected nested-name-specifier before "A"
main.cpp:11: error: using-declaration for non-member at class scope
main.cpp:11: error: expected `;'' before ''('' token
main.cpp:11: error: expected unqualified-id before '')'' token
make.exe: *** [main.o] Error 1
EDITAR Lo siguiente, sin embargo, compila bien, sin violación de acceso, por lo que parece que esto está relacionado con las plantillas:
class A
{
A(){}
};
class B : public A
{
using A::A;
};
int main(int argc, char* argv[])
{
return 0;
}
¿Crees que vale la pena informar a Microsoft? ¿Alguien más puede reproducir esto? Tal vez intente en Visual Studio 2013 para ver si todavía ocurre?
Dado que esto es reproducible por otros en plataformas de Visual C ++, he abierto un informe de error en connect.microsoft.com/VisualStudio/feedback/details/800362/… como "respuesta".
Además, como solución alternativa, la siguiente sintaxis funciona:
using A<T>::A<T>;