Frage

Ich bin konsequent in einen internen Compiler-Fehler ausgeführt wird, während sie von MSVC6 zu MSVC 2008. Nach viel Arbeit zu kommentieren aus verschiedenen Teilen des Programms zu wechseln versucht, habe ich den Fehler auf zwei Codezeilen in zwei verschiedenen CPP-Dateien verfolgt . Beide CPP-Dateien kompilieren erfolgreich, doch irgendwie haben eine Auswirkung auf, ob der Fehler manifestiert sich in anderen Dateien.

Diese beiden Linien beinhalten instantianting mehrere komplexe, verschachtelte Vorlagen. Sie erscheinen auch die einzigen Orte in der App sein, die eine abstrakte Klasse als eine der Template-Parameter verwenden. Das heißt, ich bin keineswegs sicher, dass die Ausgabe entweder abstrakte Klassen oder Vorlagen handelt, es ist nur das offensichtlichste, was ich bemerkt habe. Ich kann es nicht auch darauf verlassen, dass diese Linien von Bedeutung sind überhaupt nicht. Hier ist, wie sie aussehen, aber:

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

Also wir haben SObjDict, eine templatized Wörterbuch Klasse, SIDataSource, eine abstrakte Schnittstelle und der Parameter ist ein Zeiger auf eine statische Elementfunktion von RWCString.

Ich habe um einig mit dem Code gespielt, und ich kann gelegentlich die Fehlermeldung erhalten, um von einer CPP-Datei in einem anderen zu verschieben (zum Beispiel, änderte ich eine Reihe von Template-Deklarationen von class mit bis typename), aber ich kann ‚t jeden Sinn und Verstand, um es finden.

Ich bin ratlos, wie diese Frage weiter zu debuggen. Die genaue Fehlerausgabe durch den Compiler (mit dem Namen meiner Quelldatei geändert) ist unten. Es gibt keine Erwähnung davon überall im Internet. Ich bin ziemlich verzweifelt für Ratschläge, wie zu verfahren. Ich erwarte nicht, dass jemand sagen „oh, die Sie gerade XYZ tun müssen“, sondern ein Zeiger auf, wie man diese Art von Problem zu debuggen, würde sehr geschätzt werden.

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)
War es hilfreich?

Lösung

Ich fühle mich etwas schlecht eine Antwort auf meine eigene Frage zu stellen und zu akzeptieren, aber ich denke, es ist das Richtige zu tun ... ich mein Problem gelöst, zumindest vorübergehend. Der Trick scheint vorkompilierte Header zu deaktivieren werden. Ich habe keine Ahnung Warum Das löst das Problem, und es ist sehr bedauerlich, da meine Build-Zeit für das betroffene Projekt von weniger als 30 Sekunden auf knapp 5 Minuten gegangen ist, aber zumindest kann ich nach vorne Fortschritte .. . Wenn jemand mit einer dauerhafteren Lösung kommt, würde ich mehr als glücklich, ihre Antwort als akzeptiert zu markieren.

Andere Tipps

Es ist eine vernünftige Wette, dass p2symtab.c anzunehmen, (Teil) Code der Symboltabelle. Dies würde sofort erklären, wie das Upgrade sie verursacht hat; Dieser Code wurde neu geschrieben. (Denken Sie daran, die 255 Zeichen Länge Warnungen von VC6?)

In diesem Fall gibt es keinen neuen Eintrag in der Symboltabelle, so ist es wahrscheinlich ein Nachschlag in der Symboltabelle Fehlern spectactularly. Es wäre interessant zu sehen, ob der Kontext, in der th Namenssuche geschieht das Ergebnis beeinflusst. Zum Beispiel, was passiert, wenn Sie den Code

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

Dies wird ein weiteres Symbol Tabelleneintrag erzwingen erstellt, für SObjDict_RWCString_SIDataSource werden. Dieser Eintrag ist sozusagen eine symbolische Verknüpfung mit der Vorlage Instanziierung . Der neue Name kann (und muß) allein nachgeschlagen werden.

Starten Sie es in kleinere Teile zu brechen. Meine erste Vermutung ist der Zeiger auf die statische Funktion wird das Problem sein. Können Sie eine Dummy-Nicht-Template-Klasse mit dem gleichen Parameter im Konstruktor machen? Ist es kompiliert, wenn Sie nicht eine abstrakte Klasse in der Vorlage verwenden?

Sieht aus wie ich Sie in der falschen Richtung bin das Senden, das folgende kompiliert im Jahr 2008 gut:

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;
}

Das Prinzip bleibt jedoch entfernen / ersetzen komplexe Elemente, bis Sie einen Code, der kompiliert und Sie wissen, was das Problem verursacht.

schwerwiegender Fehler C1001: ein interner Fehler in dem Compiler aufgetreten. 1> (Compiler-Datei ‚f: \ dd \ vctools \ Compiler \ utc \ src \ p2 \ p2symtab.c

i beobachtete auch die gleichen Fehler, wenn ich versuche zu vs 2008 meine vs 2005 Code zu bauen, aber es passieren, bis ich nicht zu Service Pack von VS 2008 ...

installiert habe

haben Sie Service Pack installiert ... Ich denke, das wird das Problem behoben ....

Dies geschieht in der Regel mit Vorlage Instanziierung. Leider kann es durch viele Dinge verursacht werden, aber 99% der Zeit wird Ihr Code subtil undefiniertes Verhalten aufruft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top