Pregunta

me encontré con un síntoma muy extraño. ¿Quién me puede decir cuál es la causa raíz es?

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. Añadir un nuevo archivo llamado CPP main.cpp
  3. Pegue el código siguiente en main.cpp
  4. Compilar
  5. El compilador se bloquea e informa del siguiente mensaje:
  

\ error \ main.cpp (54893757): error grave   C1001: Se ha producido un error interno   en el compilador. (Archivo del compilador   'Msc1.cpp', línea 1420)

     

Para solucionar este problema, pruebe   simplificar o modificar el programa   cerca de los lugares indicados anteriormente.   Por favor, elegir el Soporte Técnico   comando en el menú Ayuda de Visual C ++,   o abra la Ayuda de soporte técnico   archivo para más información.

     

Este error se produjo en el texto inyectada:

     

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

     

Construir fracasado.

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; 
}
¿Fue útil?

Solución

¿Has probado ningún tipo de solución de problemas a ti mismo?

Me puede reproducir el accidente utilizando el código fuente de arriba como usted la 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); 

A los pocos segundos más de la solución de problemas que descubre comentando toda la clase XTest, las compilaciones de código y se ejecuta sin ningún problema (y lo más importante, sin que se caiga el compilador). Eso me dice (y debe decirle) que el problema reside claramente en algún lugar dentro de la clase XTest.
Usted no puede dejar de preguntarse si eso tiene algo que ver con los errores de compilación que se están generando.

Bueno, ¿qué tal si nos basta con comentar que sola línea que está produciendo los errores de compilación? ¡Que sabes! Las compilaciones de código y se ejecuta muy bien!

Así que 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 lo que todo el código hace Sin embargo, puesto que creo que se puede tomar desde aquí ahora que usted sabe exactamente dónde concentrar sus esfuerzos. Para empezar, la fijación de los errores de IntelliSense y ver si sus compila el código sin que se caiga el compilador.

Otros consejos

autores

compilador no ponen una prioridad muy alta en corregir errores en su compilador que no afectan a la capacidad del compilador para generar una salida válida de entrada válida. Y entre esos errores, la prioridad muy baja va a esos bichos que no producen silencio de salida válida.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top