Pregunta

Me encuentro constantemente con un error interno del compilador al intentar cambiar de MSVC6 a MSVC 2008. Después de mucho trabajo comentando diferentes partes del programa, he rastreado el error a dos líneas de código en dos archivos CPP diferentes . Ambos archivos CPP se compilan correctamente, pero de alguna manera tienen un efecto sobre si el error se manifiesta o no en otros archivos.

Ambas líneas implican la creación de instancias de varias plantillas complejas y anidadas. También parecen ser los únicos lugares en la aplicación que usan una clase abstracta como uno de los parámetros de la plantilla. Dicho esto, estoy lejos de estar seguro de que el problema involucra clases abstractas o plantillas, es lo más obvio que he notado. Ni siquiera puedo estar seguro de que estas líneas sean significativas en absoluto. Sin embargo, así es como se ven:

m_phDSAttributes = new SObjDict<RWCString, SIDataSource>(&RWCString::hash);

Entonces tenemos SObjDict, una clase de diccionario con plantilla, SIDataSource, una interfaz abstracta, y el parámetro es un puntero a una función miembro estática de RWCString.

He estado jugando un poco con el código, y ocasionalmente puedo obtener el error de moverme de un archivo CPP a otro (por ejemplo, cambié un montón de declaraciones de plantillas al usar class typename ), pero no puedo encontrar ninguna rima o razón para ello.

No sé cómo depurar más este problema. El error exacto generado por el compilador (con el nombre de mi archivo fuente cambiado) está abajo. No se menciona en ninguna parte de Internet. Estoy bastante desesperado por cualquier consejo sobre cómo proceder. No espero que alguien diga '' oh, solo necesitas hacer XYZ '', pero agradeceríamos mucho un indicador sobre cómo depurar este tipo de problema.

1>d:\Dev\webapi.cpp : fatal error C1001: An internal error has occurred in the compiler.
1>(compiler file 'f:\dd\vctools\compiler\utc\src\p2\p2symtab.c', line 5905)
¿Fue útil?

Solución

Me siento algo mal al responder a mi propia pregunta y aceptarla, pero supongo que es lo correcto ... Resolví mi problema, al menos temporalmente. El truco parece ser deshabilitar encabezados precompilados. No tengo idea de por qué que resuelve el problema, y ??es muy lamentable ya que mi tiempo de construcción para el proyecto afectado ha pasado de menos de 30 segundos a casi 5 minutos, pero al menos puedo avanzar. . Si a alguien se le ocurre una solución más permanente, estaría más que feliz de marcar su respuesta como Aceptada.

Otros consejos

Es una apuesta razonable suponer que p2symtab.c es (parte de) el código de la tabla de símbolos. Esto explicaría de inmediato cómo lo causó la actualización; Este código ha sido reescrito. (¿Recuerdas las advertencias de 255 caracteres de longitud de VC6?)

En este caso, no hay una nueva entrada en la tabla de símbolos, por lo que es probable que una búsqueda en la tabla de símbolos falle espectacularmente. Sería interesante ver si el contexto en el que ocurre la búsqueda del nombre afecta el resultado. Por ejemplo, qué sucede si cambia el código a

typedef SObjDict<RWCString, SIDataSource> SObjDict_RWCString_SIDataSource;
m_phDSAttributes = new SObjDict_RWCString_SIDataSource(&RWCString::hash);

Esto forzará la creación de otra entrada de tabla de símbolos, para SObjDict_RWCString_SIDataSource . Esta entrada es una especie de enlace simbólico a la plantilla instanciación . El nuevo nombre puede (y debe) buscarse por sí solo.

Comienza a dividirlo en partes más pequeñas. Mi primera suposición es que el puntero a la función estática será el problema. ¿Se puede hacer una clase ficticia sin plantilla con el mismo parámetro en el constructor? ¿Se compila si no usa una clase abstracta en la plantilla?

Parece que te estoy enviando en la dirección equivocada, las siguientes compilaciones están bien en 2008:

class thing {
public:
    static void hash( short sht ) {
    }

    void hash( long lng ) {
    }
};

class thing2 {
public:
    thing2( void (short ) ){}
};

int _tmain(int argc, _TCHAR* argv[])
{
    thing2* t = new thing2( &thing::hash );
    delete t;
    return 0;
}

Sin embargo, el principio sigue siendo, eliminar / reemplazar elementos complejos hasta que tenga un código que compile y sepa qué está causando el problema.

error fatal C1001: se ha producido un error interno en el compilador. 1 > (archivo del compilador 'f: \ dd \ vctools \ compiler \ utc \ src \ p2 \ p2symtab.c

También observé el mismo error cuando intento compilar mi código vs 2005 a vs 2008. pero sucede hasta que no haya instalado el Service Pack de VS 2008 ...

ha instalado el Service Pack ... creo que esto resolverá su problema ...

Esto suele suceder con la creación de instancias de plantilla. Desafortunadamente, podría deberse a muchas cosas, pero el 99% del tiempo su código invoca sutilmente un comportamiento indefinido.

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