2009-10-15 2 views
7

Ich frage mich, ob es eine Möglichkeit gibt, bessere Informationen über den Ort eines Fehlers in msvc (2005) zu erhalten?Gibt es eine Möglichkeit, bessere Informationen für den Kontext eines Fehlers zu erhalten, wenn Sie msvc verwenden? (ex: C2248)

Wenn zum Beispiel von boost :: noncopyable in meiner Klasse zu erben bekomme ich einen C2248 Fehler etwas sagen wie:

Fehler C2248: 'boost :: noncopyable _ :: noncopyable :: noncopyable': nicht zugreifen kann privates Member, das in der Klasse 'boost :: noncopyable _ :: noncopyable' deklariert ist. Diese Diagnose im Compiler erzeugte Funktion aufgetreten ‚MyClass :: MyClass (const myClass &)‘

aber es fehlen mir zu sagen, wo genau wurde die Kopie Konstruktor aufgerufen. Das ist ein bisschen nervig. Ich bin wirklich nicht sicher, aber ich denke, ich erinnere mich an eine Einstellung irgendwo wo ich die Ausgabeebene oder etwas angeben konnte, aber ich suchte und fand nichts, also meine Frage ist: Gibt es eine Möglichkeit, besser (voller?) Fehlermeldung in msvc ?

Edit: Nun, da stackoverflow sagte mir nur, dass ich eine Antwort akzeptieren sollte, fragte ich mich, ob jemand könnte sagen, wenn msvc 2008/2010 eine bessere Diagnose für diesen Fehler geben? Jemand erwähnte auch, dass GCC tun sollte, kann jemand das bestätigen? Was ist mit anderen Compilern (Intel ?, Comeau?)

Dank

+2

Ich habe das auch schon mal erlebt. Vielleicht würde es sich lohnen, es auf connect.microsoft.com zu melden. – jalf

+0

Scheint, dass es bereits gemeldet und geschlossen wurde, weil es nicht als wichtig eingestuft wurde. Danke für den Link, von dem ich nichts wusste. Es scheint, als könnte es nützlich sein. – n1ckp

+0

Hier ist der Link auf connect, wenn jemand interessiert, um es abzustimmen: https://connect.microsoft.com/VisualStudio/feedback/details/467747/compiler-shows-error-but-with-no-hint-to-the- -users-Quellcode. Hatte gerade ein ähnliches Problem mit einem fehlenden Semikolon am Ende einer Klassendefinition und vs würde mir keinen hilfreichen Hinweis in dem Fehler geben. – n1ckp

Antwort

4

Ich kann mit Code :: Blocks und VC++ 2005 bestätigen, dass es keinen Hinweis gibt, wo der Fehler auftritt. Das Deklarieren einer eigenen privaten Konstruktorhilfe wird auch nicht ausgeführt.

#include <boost/noncopyable.hpp> 

class X: boost::noncopyable 
{ 
}; 

void foo(X x) {} 

int main() 
{ 

    X x; 
    foo(x); 
} 

Die Kompilierung log (Zeile fünf ist die letzte Zeile der Klassendeklaration):

main.cpp(5) : error C2248: 'boost::noncopyable_::noncopyable::noncopyable' : cannot access private member declared in class 'boost::noncopyable_::noncopyable' C:\boost_1_38_0\boost/noncopyable.hpp(27) : see declaration of 'boost::noncopyable_::noncopyable::noncopyable' C:\boost_1_38_0\boost/noncopyable.hpp(22) : see declaration of 'boost::noncopyable_::noncopyable' This diagnostic occurred in the compiler generated function 'X::X(const X &)'

Sofern es einen Compiler-Schalter ist gründlichere Fehlerdiagnose zu ermöglichen, diese wouldn Es ist für mich nicht das erste Mal, dass ich die Datei mit GCC (MinGW) kompiliere, um hilfreichere Fehlerdiagnosen zu erhalten. (Leider sollte Ihr Code keine VC++ - Erweiterungen enthalten.)

+0

Ich erinnere mich nicht, dass o ne. Zumindest kann man recht schnell abschätzen, was das Problem bei nicht kopierbaren ist. –

+0

Das Problem ist nicht mit nicht kopierbar. Das Problem ist, dass * Ihr * Code versucht, etwas zu kopieren, das nicht kopiert werden soll. – UncleBens

+1

Das ist was ich meinte. Wenn Sie nicht kopierbar sind, können Sie im Gegensatz zu anderen Anwendungsfällen schnell herausfinden, was es bedeutet. Es gibt auch keinen nützlichen cl.exe-Schalter, der mehr Licht in dieses Thema bringt. –

-1

Im Ausgabefenster oder das Protokoll der Assemblierung sollten Sie sehen, wo der Compiler die Vorlage in Ihrem Code zu verwenden versucht ... Sie um scrollen ein bisschen obwohl.

Wenn nicht genügend Informationen in den Build-Protokolle ist, gibt es auch eine Option Steuerung msbuild Ausführlichkeit:
Extras-> Optionen-> Projekte und Solutions-> Bauen und Run-> MSBuild Projektausgabe Ausführlichkeit

+0

Danke. Das war genau die Optionen, über die ich nachgedacht habe. Ich werde versuchen, ob es mehr Informationen geben und zurück melden. Danke. – n1ckp

+2

Ich habe versucht, leider hilft es nicht - siehe UncleBens Antwort. –

0

Sie könnten vorübergehend einen manuellen Kopierkonstruktor (mit der gleichen Signatur) und die Standardimplementierung erstellen, nur um diesen Fehler aufzuspüren ..? Ich bin mir nicht sicher, ob das das Finden leichter machen würde.

+0

Meine Frage ist nicht verwandt mit diesem bestimmten Fehler Mein aktueller Fehler bezieht sich nicht auf einen Kopierkonstruktor. Das war ein Beispiel. Immer noch, danke für die Beantwortung. – n1ckp

-1

Öffnen Sie das Ausgabefenster, in dem das vollständige Gebäudeprotokoll angezeigt wird. Überprüfen Sie dort die Fehlermeldung. Unter dieser Fehlermeldung können Sie normalerweise mehr Informationen finden, mit denen Sie die Ursache des Problems verfolgen können.

Wenn Sie das Problem in der Fehlerliste doppelklicken und zum Ausgabefenster wechseln, wird der Cursor auf diese Fehlermeldung positioniert.

+0

Hmm Ich wusste, ich sollte die gesamte Zeichenfolge kopieren/einfügen, so dass Sie nicht glauben, dass ich habe Ich habe das aus den Ausgabefenstern und der einzige Verweis, den ich habe, um den Fehler zu finden, ist die CPP-Datei, in der der Fehler aufgetreten ist, aber ich möchte den Speicherort des Aufrufs zum Kopierkonstruktor oder mehr wissen info kann ich bekommen, danke trotzdem. – n1ckp

+0

Mit Vorlagen müssen Sie in der Regel scrollen nach unten einige 'Lärm', um zu dem Teil, wo Ihre Quelle erwähnt wird –

0

Eigentlich ist der beste Weg, um diesen (VS2013 hier) Umgehung scheint iterativ über das Ausgabefenster zu kriechen:

1 /, wenn die Meldung „Diese Diagnose trat in der Compiler erzeugte Funktion‚X erhalten :: X (const X &) '"in der Ausgabe, gehen Sie zu Ihrer' X '-Klasse und entfernen Sie explizit den Kopierkonstruktor mit der C++ 11 Notation:" X (const X &) = löschen; "

2/rekompilieren, jetzt muss die Ausgabe den gleichen Fehler anzeigen, aber mit einer Diagnose für untergeordnete Klassen, dann erneut zu Schritt 1 gehen, um den Kopierkonstruktor für die untergeordnete Klasse explizit zu löschen, bis der tatsächliche Fehler erreicht ist Klasse ...

Verwandte Themen