0

Gibt es einen "Aufrufstack" für Compilerfehler in Visual Studio 2005 (C++)?"Aufrufstapel" für C++ - Fehler in Visual Studio 2005

Zum Beispiel verwende ich einen boost :: scoped_ptr als Wert in einem QHash. Dies ist jedoch verursacht den folgenden Compiler-Fehler:

1>c:\qt\include\qtcore\../../src/corelib/tools/qhash.h(743) : error C2248: 'boost::scoped_ptr<T>::operator =' : cannot access private member declared in class 'boost::scoped_ptr<T>' 

Von der Build-Ausgabe Ich weiß, welche meine Quelldateien die Fehler verursacht und die Zeilennummer in der qhash.h, die den Fehler verursacht, aber ich versuche zu verfolgen Sie die Zeilennummer in meine Quelldatei, die den Fehler generiert (daher die "Call-Stack" Idee).

Bitte beachten Sie, ich bin nicht auf der Suche nach der Lösung für das Problem der Verwendung eines scoped_ptr in einem QHash, sondern das Problem zu finden, wo Kompilierungsfehler generiert werden. Dies wäre auch nützlich, um seltsame Warnungen aufzuspüren. Meistens stoße ich auf dieses Problem, wenn ich Templates verwende.

Danke!

+0

Gut, dass Sie Ihre Frage visual-studio ... getaggt ... sonst würde ich es wagen zu behaupten, dass g ++ Fehler viel einfacher zu lesen sind, und oft führen Sie den tatsächlichen Fehler effektiver ... – xtofl

+0

Ich denke, das wäre einer Lösung (obwohl eine ziemlich langweilige), um eine gcc-Umgebung einzurichten und alles dort neu zu kompilieren. Für ein kleineres Projekt würde ich es definitiv versuchen. –

+0

Sobald Sie sich an sie gewöhnt haben, sind die VC++ Einsen nicht so schlecht. Aber ich stimme generell zu, dass g ++ bessere Fehlermeldungen hat. Das eigentliche Problem besteht darin, dass Sie verstehen müssen, was der Compiler zuerst versucht, um die Fehlermöglichkeiten zu verstehen. –

Antwort

0

Wenn Sie sich die Build-Ausgabe ansehen, sollten Sie sehen, welches Projekt und welche .cpp-Datei kompiliert wurde, als dieser Fehler auftrat.

Es gibt hier wirklich keine Idee von "call stack", da der Compiler jeweils eine Quelldatei verarbeitet. Sie haben einen Compiler-Fehler in der Header-Datei, also müssen Sie herausfinden, welche Quelldatei einschließlich dieser Header kompiliert wurde.

+0

Ich habe dich nicht modifiziert, aber ich habe meine Frage aktualisiert, um etwas genauer zu sein, wonach ich gesucht habe. –

+0

-1: Die Tatsache, dass eine einzelne Kompilierungseinheit gleichzeitig betrachtet wird, hindert den Compiler nicht daran zu wissen, woher der inkriminierte Aufruf stammt. Diese Art von Fehlern wird oft durch etwas auf einer höheren Ebene als die vom Compiler berichtete verursacht. –

+0

In diesem Fall würde die Zeile in Ihrer Quelldatei, die diesen Fehler verursacht, diejenige sein, die eine Instanz von QHash mit scoped_ptr deklariert. Dies ist die Sache mit Vorlagen. scoped_ptr muss gegen eine Annahme verstoßen, die QHash über seinen Vorlagenparameter vornimmt. – Dima

0

Diese Art von Fehlern kann schwer zu finden sein. Normalerweise komme ich am Ende Code auskommentieren und finde die störende Linie und arbeite von dort. Nachdem Sie es eine Weile getan haben, werden Sie lernen, die Fehlermeldungen besser zu lesen und zu verstehen, was den Compiler stolperte. So wie es aussieht, sind die Fehlermeldungen des Compilers einfach schrecklich.

In diesem Fall heißt es, dass Sie ein Objekt vom Typ boost::scoped_ptr<T> haben, das versucht zu kopieren, aber die Klasse lässt Sie nicht (operator = und die Kopie ctor sind beide ausgeblendet). Sie müssen also sehen, wie die Klasse verwendet wird und sehen, warum sie versucht wird, sie zu kopieren. Vielleicht ist ein scoped_ptr nicht was du brauchst. Vielleicht brauchen Sie eine shared_ptr?

2

Manchmal mit seltsamen Fehlern hilft es, die Datei vorzuverarbeiten und auf diese Ausgabe zu schauen. Mit VS suchen Sie unter Vorverarbeitungseinstellungen nach "Vorverarbeitete Datei generieren" (oder setzen Sie die Option/P). Dies erzeugt XXX.i aus XXX.cpp, was Ihnen helfen könnte, das Problem zu lösen.

Stellen Sie sicher, dass Sie den Schalter ausschalten, wenn diese Option aktiviert ist, wird keine obj-Datei generiert.

+0

Ich hatte nur eine Chance, dies zu überprüfen. Ich weiß, welche Zeile das Problem verursacht, aber der/P-Schalter hat nicht geholfen, es herauszufinden. Gute Idee aber. –