7

Encontré un síntoma muy extraño. ¿Quién puede decirme cuál es la causa raíz?¿Por qué falla el compilador de VC++ 2010 al compilar código simple?

Mi VC++ versión del compilador es más reciente: "Microsoft Visual C++ 2010: 01019-532-2002102-70860"

pasos para reproducir:

  1. crear un proyecto de consola Win32 vacía
  2. Agregue un nuevo archivo cpp denominado main.cpp
  3. Pegue el siguiente código en main.cpp
  4. Compile
  5. Los accidentes compilador e informes el siguiente mensaje:

\ error \ main.cpp (54893757): Error grave C1001 : Un error interno ha ocurrido en el compilador. (Archivo del compilador 'msc1.cpp', línea 1420)

Para evitar este problema, intente simplificar o modificar el programa cerca de los lugares indicados anteriormente. Seleccione el comando de soporte técnico en el menú Ayuda de Visual C++, o abra el archivo de ayuda técnica para obtener más información. ocurrió

Este error en el texto inyectada:

d: \ bug \ main.cpp (63): véase referencia a función de plantilla instanciación 'XDummy de prueba (T)' siendo compilado con [ T = int ]

Build FAILED.

A continuación se muestra el código fuente de main.cpp:

#include <vector> 

template<class It_> 
struct trait_dummy 
{ 
    static const int value = std::tr1::is_convertible<typename iterator_traits<It_>::iterator_category, int>::value;  
}; 

template<class It_> 
class X 
{ 
public: 
    template<class T_> 
    X(T_& rColl) 
    {} 
}; 

template<class T_> 
X<typename T_::iterator> f(T_ rColl, std::false_type) 
{ 
    return X<typename T_::iterator>(rColl); 
} 

template<class T_> 
auto f(T_& rColl) -> decltype(f(rColl, std::false_type())) 
{ 
    return f(rColl, std::false_type()); 
} 

template<class It_> 
X<It_> f(It_ first, size_t nSize, typename std::tr1::enable_if<trait_dummy<It_>::value>::type* dummy = 0) 
{ 
    return X<It_>(first, first + nSize); 
} 

class XTest 
{ 
public: 
    void foo() 
    { 
     auto v = f(m_Suite); 
    }  

    std::vector<int> m_Suite; 
}; 

const int g_dummy = 0; 
class XDummy 
{ 
public: 
    XDummy(int, int, int, int dummy = g_dummy) 
    {} 
}; 

template<class T> 
XDummy Test(T) 
{  
    return XDummy(0, 0, 0); 
} 

int main() 
{ 
    Test(0); 
    //XTest().foo(); 

    return 0; 
} 
+2

Si puede reducir su código al código mínimo que causa el error del compilador interno, considere enviar un informe de error a [Microsoft Connect] (http://connect.microsoft.com/). –

+0

Usar la palabra clave auto así parece malo/flojo. No quiero tener que cavar a través de múltiples capas de llamadas a función para averiguar qué tipo devuelve una función. Y si el tipo de devolución de una función interna cambia, preferiría obtener errores de compilación en el punto en que se llamó a la función modificada en lugar de dos capas hacia arriba, preguntándome qué sucedió y teniendo que buscar la causa del cambio () ... Usar auto es útil cuando se definen variables de iterador locales, pero usarlo en firmas de función parece una mala idea. –

+0

@Leo Davidson: No me gusta auto + decltype también. Sin embargo, en muchos casos, auto + decltype es indispensable. Si no es necesario, no los usaré para definir una función. – xmllmx

Respuesta

5

¿Ha intentado cualquier tipo de resolución de problemas a ti mismo?

Puedo reproducir el bloqueo usando el código fuente anterior como usted describe. Por supuesto, tengo un par de advertencias:

  • "IntelliSense: ninguna instancia de función sobrecargada 'f' coincide con la lista de argumentos"
  • "IntelliSense: muy pocos argumentos en función de llamada"

tanto en referencia a esta línea:

auto v = f(m_Suite); 

unos segundos más de la solución de problemas descubre que comentando toda la clase XTest, el código se compila y ex ecutes sin problemas (y lo más importante, sin bloquear el compilador). Eso me dice (y debería decirte) que el problema claramente se encuentra en algún lugar dentro de la clase XTest.
No puede evitar preguntarse si eso tiene algo que ver con los errores del compilador que se están generando.

Bueno, ¿qué tal si solo comentamos esa sola línea que está produciendo los errores del compilador? ¡Que sabes! ¡El código compila y ejecuta muy bien!

En menos de un minuto, hemos reducido el culpable a una sola línea de código. No voy a tomar realmente el tiempo para entender exactamente todo lo que hace su código, sin embargo, ya que creo que puede tomarlo desde aquí ahora que sabe exactamente dónde concentrar sus esfuerzos. Comience por corregir esos errores IntelliSense y vea si su código se compila sin colapsar el compilador.

+1

Note que los errores de "IntelliSense ..." no son realmente errores del compilador ya que son generados por IntelliSense, no por el compilador. El compilador de Visual C++ e IntelliSense utilizan interfaces completamente diferentes, por lo que a menudo uno puede informar un error mientras que el otro no. –

+3

Lo divertido de IMO sobre el compilador no válido del código no es que el código no sea válido, sino que bloquea el compilador :) –

+1

@James McNellis: Tienes razón en que no son estrictamente errores del compilador, pero las advertencias me parecen indicar algo puede estar mal con esa línea de código, y de mis pruebas, ese es el caso. Eso debería al menos hacerles merecer algo de atención, dadas las circunstancias. –

0

Los autores del compilador no le dan una prioridad muy alta a la corrección de errores en su compilador que no afectan la capacidad del compilador de generar resultados válidos a partir de entradas válidas. Y entre esos errores, la prioridad más baja se aplica a los errores que no producen silenciosamente resultados no válidos.

Así que la respuesta a su pregunta es que lo más probable es que sea porque este error no se informó previamente o porque se le ha asignado una prioridad muy, muy baja.

Cuestiones relacionadas