Question

Je rencontre régulièrement une erreur interne du compilateur lorsque je tente de passer de MSVC6 à MSVC 2008. Après de nombreuses critiques sur différentes parties du programme, j'ai tracé l'erreur sur deux lignes de code dans deux fichiers CPP différents. . Ces deux fichiers CPP se compilent avec succès, mais ont toutefois une incidence sur le fait que l’erreur se manifeste ou non dans d’autres fichiers.

Ces deux lignes impliquent l’instantiation de plusieurs modèles complexes et imbriqués. Ils semblent également être les seuls endroits de l'application qui utilisent une classe abstraite comme l'un des paramètres du modèle. Cela dit, je suis loin d’être certain que le problème concerne des classes abstraites ou des modèles, c’est la chose la plus évidente que j’ai remarquée. Je ne peux même pas être sûr que ces lignes sont significatives. Voici à quoi ils ressemblent, cependant:

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

Nous avons donc SObjDict, une classe de dictionnaire modélisée, SIDataSource, une interface abstraite et le paramètre est un pointeur sur une fonction membre statique de RWCString.

Je me suis amusé avec le code, et je peux parfois avoir l’erreur de passer d’un fichier CPP à un autre (par exemple, j’ai modifié plusieurs déclarations de modèles en utilisant class typename ), mais je ne trouve aucune rime ni raison.

Je ne sais pas trop comment résoudre ce problème. L'erreur exacte générée par le compilateur (avec le nom de mon fichier source modifié) est ci-dessous. Il n’en est fait mention nulle part sur Internet. Je suis assez désespéré pour tout conseil sur la façon de procéder. Je ne m'attends pas à ce que quelqu'un dise "oh, vous devez juste faire XYZ", mais un pointeur sur la façon de déboguer ce type de problème serait grandement apprécié.

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)
Était-ce utile?

La solution

Je me sens un peu mal de répondre à ma propre question et de l'accepter, mais je suppose que c'est la bonne chose à faire ... J'ai résolu mon problème, au moins temporairement. Le truc semble être de désactiver les en-têtes précompilés. Je ne sais pas du tout pourquoi cela résout le problème. C’est très regrettable, car le temps de construction de ce projet est passé de moins de 30 secondes à près de 5 minutes, mais au moins, je peux progresser. Si quelqu'un propose une solution plus permanente, je serais très heureux de marquer sa réponse comme acceptée.

Autres conseils

Il est raisonnable de supposer que p2symtab.c fait partie du code de la table des symboles. Cela expliquerait immédiatement comment la mise à niveau l'a provoquée; ce code a été réécrit. (Vous vous souvenez des avertissements de 255 caractères de longueur de VC6?)

Dans ce cas, il n'y a pas de nouvelle entrée dans la table des symboles. Il est donc probable qu'une recherche dans la table des symboles échoue de façon spectaculaire. Il serait intéressant de voir si le contexte dans lequel la recherche de nom est effectuée affecte le résultat. Par exemple, que se passe-t-il si vous modifiez le code en

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

Ceci forcera la création d'une autre entrée dans la table des symboles, pour SObjDict_RWCString_SIDataSource . Cette entrée est en quelque sorte un lien symbolique vers le modèle instanciation . Le nouveau nom peut (et doit) être recherché seul.

Commencez par le décomposer en parties plus petites. Ma première hypothèse est que le pointeur sur la fonction statique sera le problème. Pouvez-vous créer une classe factice sans modèle avec le même paramètre dans le constructeur? Compile-t-il si vous n'utilisez pas de classe abstraite dans le modèle?

On dirait que je vous envoie dans la mauvaise direction, la compilation suivante est parfaite 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;
}

Le principe reste cependant, supprimez / remplacez les éléments complexes jusqu'à ce que le code soit compilé et que vous sachiez quelle est la cause du problème.

erreur fatale C1001: une erreur interne s'est produite dans le compilateur. 1 > (fichier de compilation 'f: \ dd \ vctools \ compiler \ utc \ src \ p2 \ p2symtab.c

J'ai aussi observé la même erreur lorsque j'essayais de construire mon code vs 2005 par rapport à 2008, mais cela arrive tant que je n'ai pas installé le Service Pack de VS 2008 ...

avez-vous installé le Service Pack ... Je pense que cela résoudra votre problème ....

Cela se produit généralement avec l'instanciation de modèles. Malheureusement, cela pourrait être dû à beaucoup de choses, mais 99% du temps, votre code appelle de manière subtile un comportement indéfini.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top