2008-09-07 8 views
25

Ich beginne wirklich zu verstehen, was Menschen meinen, wenn sie sagen, dass C++ - Fehlermeldungen sind ziemlich schrecklich in Bezug auf Vorlagen. Ich habe schrecklich lange Fehler für Dinge gesehen, die so einfach sind wie eine Funktion, die nicht mit ihrem Prototyp übereinstimmt.Entschlüsselung C++ Vorlage Fehlermeldungen

Gibt es Tricks, um diese Fehler zu entschlüsseln?

EDIT: Ich benutze sowohl gcc und MSVC. Sie scheinen beide ziemlich schrecklich zu sein.

Antwort

3

Einige Compiler bessere Nachrichten als andere geben. Welchen Compiler benutzen Sie? Abgesehen davon sind sie alle ziemlich schlecht. C++ 0X wird den größten Teil dieses Problems beheben (siehe concepts), aber der Standard wird erst 2009 veröffentlicht, und die breite Unterstützung wird wahrscheinlich sogar später sein :-(

+1

-1 Sie sind noch nicht entzifferbar; vielleicht nicht so unentzifferbar wie vorher, aber immer noch schrecklich! –

+0

Ja, ich kämpfe gerade mit einem. Sie sind nur so schwer visuell zu analysieren! –

+2

Konzepte haben es nicht in C++ 11 geschafft. –

8

Ich kann das verdammt noch mal nicht Kleine Fehler explodieren in Seiten und Seiten von unlesbarem Müll. Normalerweise früh am Morgen vor dem Kaffee :(

Mein einziger Rat ist, einen tiefen Atemzug zu nehmen, an der Spitze zu beginnen und zu versuchen, die wichtigen Informationen zu analysieren (Ich weiß, einfacher gesagt als getan, oder?).

2

Zumindest in Visual Studio gibt es mehr Informationen im Ausgabe-Build-Fenster als in der Fehlerliste.Ich hatte einen Template-Fehler im Fehler Listenstatus, "Kann nicht konv ert Foo <int> bis Foo <int> ". Es gab einige Zeilen, die dem tatsächlichen Fehler im Ausgabefenster folgten, der mir half zu entziffern, was das eigentliche Problem war.

4

Wie @nsanders sagte STLFilt ist eine gute Lösung. Ein selbst erstelltes STLFilt (wenn Sie nicht die Mühe machen möchten, Perl zu installieren), besteht darin, die Fehlermeldung in einen Editor zu kopieren und Teile des Fehlers zu ersetzen, bis es (mehr) beherrschbar wird.

z.B.

s/std::basic_string<char,std::char_traits<char>,std::allocator<char>>/string/g 

In weniger geeky Begriffen bedeutet dies:

ersetzen:

std::basic_string<char,std::char_traits<char>,std::allocator<char>> 

mit:

string 
+0

Das ist nützlicher als es klingt. Ich schäme mich nicht wegen der Grenzen der Informationsüberflutung des menschlichen Gehirns - und da gibt es weniger Unterschiede zwischen den Menschen, als sie zugeben wollen. Wir können alle ungefähr die gleiche Anzahl von Mustern auf einmal zusammenbringen - der Trick besteht darin, allmählich zu lernen, größere Muster zu treffen. – breakpoint