9 Stimmen

Wie man c ++-Fehler liest, die Vorlagen betreffen

Ich lerne C++. Ich bekomme regelmäßig Fehlermeldungen wie diese

/usr/lib/gcc/i686-pc-cygwin/4.3.4/include/c++/bits/basic_string.h:1458: instanziiert von 'static _CharT* std::basic_string<_CharT, _Traits, _Alloc>::_S_construct_aux(_InIterator, _InIterator, const _Alloc&, std::__false_type) [mit _InIterator = std::istream_iterator, std::allocator >, char, std::char_traits, int>, _CharT = char, _Traits = std::char_traits, _Alloc = std::allocator]'

Wie kann ich das verstehen, damit ich zumindest einen Ansatzpunkt habe, um nach einer Lösung zu suchen?

Falls es dich interessiert, der ursprüngliche Code lautet:

#include 
#include 
#include 
#include 

using namespace std;

int main(int argc, char **argv) {
    string fileName = "example.txt";
    ifstream ifile(fileName.c_str());

    istream_iterator begin(ifile);
    istream_iterator end;

    string s(begin,end);
    cout << s;
}

6voto

UncleBens Punkte 39755

Dies ist nicht der gesamte Fehler, sondern nur eine Beschreibung einer Instanziierung.

Im Grunde interessieren Sie sich für:

1) welche Zeile in Ihrem Code den Fehler ausgelöst hat (string s(begin,end);)

2) welche Fehler resultierten daraus (z.B. kann 'const std::basic_string, std::allocator >' nicht in 'char' umwandeln) und wo

3) Sie könnten vergleichen, was die Schablone sagt, welche Parameter sie hat, und was Sie annehmen, dass sie haben.

Es braucht wahrscheinlich etwas Erfahrung, um sich vor den Fehlern nicht zu fürchten, und es hilft sicherlich, die Bibliothek gut zu kennen.

In diesem Fall liegt die Ursache darin, dass der Konstruktor des Strings einen Bereich von Zeichen erwartet, Sie jedoch einen Bereich von Strings übergeben.

5voto

Josh Kelley Punkte 52169

Verwenden Sie STLFilt.

3voto

Anycorn Punkte 48423

Comeau hat einen viel freundlicheren Compiler, schauen Sie ihn sich online an: http://www.comeaucomputing.com/tryitout/

zum Beispiel ist dies der Fehler:

Comeau C/C++ 4.3.10.1 (Oct  6 2008 11:28:09) für ONLINE_EVALUATION_BETA2
Copyright 1988-2008 Comeau Computing. Alle Rechte vorbehalten.
MODUS: strenge Fehler C++ C++0x_Erweiterungen

"string", Zeile 1175: Fehler: Es existiert keine geeignete Konvertierungsfunktion von
          "const std::string" zu "char"
      push_back(*__first);
                ^
          während der Instanziierung von "std::basic_string<_CharT, _Traits,
                    _Alloc> &std::basic_string<_CharT, _Traits,
                    _Alloc>::append(_InputIter, _InputIter,
                    std::input_iterator_tag) [mit _CharT=char,
                    _Traits=std::char_traits,
                    _Alloc=std::allocator,
                    _InputIter=std::istream_iterator, ptrdiff_t>]" in Zeile 624

1 Fehler bei der Kompilierung von "ComeauTest.c" gefunden.

was mich vermuten lässt, dass der Konstruktor eher einen char-Iterator als einen Iterator über Zeichenfolgen (wie in vielen Zeichenfolgen) erwartet:

istream_iterator begin(ifile);
istream_iterator end;

2voto

Mark B Punkte 93261

Sie haben tatsächlich die Schlüsselteile der Fehlermeldung ausgelassen. Sie erhalten zwei doppelte Fehler in g++ 4.2. Die Schlüsselteile sind: /pfad/basic_string.tcc:103: Fehler: Konvertierung von 'const std::basic_string, std::allocator >' zu 'char' in Zuweisung nicht möglich und str_iter_test.C:15: hier instantiiert.

Der erste Teil bedeutet, dass es nicht von String zu Char konvertiert werden konnte, und der zweite Teil sagt, auf welcher Zeile der Fehler aufgetreten ist, in diesem Fall string s(begin,end);.

In diesem Fall sollten Ihre Iteratoren über Char und nicht über String iterieren:

istream_iterator begin(ifile);
istream_iterator end;

1voto

James McNellis Punkte 337231

Die spezifische Fehlermeldung, die Sie anzeigen, sollte nur Teil des Fehlers sein, der von g++ ausgegeben wird. Der vollständige Fehler sollte in etwa wie folgt aussehen (ich habe die Pfade gekürzt, und diese Ausgabe stammt von 4.1.2):

basic_string.tcc: In statischer Elementfunktion 'static _CharT* std::basic_string<_CharT, _Traits, _Alloc>::_S_construct(_InIterator, _InIterator, const _Alloc&, std::input_iterator_tag) [mit _InIterator = std::istream_iterator, std::allocator >, char, std::char_traits, int>, _CharT = char, _Traits = std::char_traits, _Alloc = std::allocator]':
basic_string.h:1449:   instanziiert von 'static _CharT* std::basic_string<_CharT, _Traits, _Alloc>::_S_construct_aux(_InIterator, _InIterator, const _Alloc&, __false_type) [mit _InIterator = std::istream_iterator, std::allocator >, char, std::char_traits, int>, _CharT = char, _Traits = std::char_traits, _Alloc = std::allocator]'
basic_string.h:1464:   instanziiert von 'static _CharT* std::basic_string<_CharT, _Traits, _Alloc>::_S_construct(_InIterator, _InIterator, const _Alloc&) [mit _InIterator = std::istream_iterator, std::allocator >, char, std::char_traits, int>, _CharT = char, _Traits = std::char_traits, _Alloc = std::allocator]'
basic_string.tcc:241:   instanziiert von 'std::basic_string<_CharT, _Traits, _Alloc>::basic_string(_InputIterator, _InputIterator, const _Alloc&) [mit _InputIterator = std::istream_iterator, std::allocator >, char, std::char_traits, int>, _CharT = char, _Traits = std::char_traits, _Alloc = std::allocator]'
t.cpp:16:   instanziiert von hier
Zeile 101: Fehler: kann 'const std::basic_string, std::allocator >' nicht in 'char' umwandeln in der Zuweisung
Kompilierung aufgrund von -Wfatal-errors abgebrochen.

Das ist nicht besonders freundlich, oder? :-) Die nützlichen Zeilen im Fehler sind die Zeilen am Ende, nicht die Zeilen am Anfang. Die Fehlermeldung wird in umgekehrter Reihenfolge ausgegeben: der erste Fehler ist der tatsächliche Fehler, dann zeigen die folgenden Zeilen Ihnen den Weg durch den Quellcode, wie der Compiler dorthin gelangt ist. Die letzte Zeile zeigt an, wo in Ihrem Quellcode der Fehler war:

t.cpp:16:   instanziiert von hier
Zeile 101: Fehler: kann '
    const std::basic_string, std::allocator >' nicht in 
    'char' umwandeln in der Zuweisung

In meiner Beispieldatei ist die Zeile t.cpp:16 folgende:

string s(begin,end);

Wenn Sie diese Zeile auskommentieren (und die darauf folgende Zeile, die s verwendet), werden Sie feststellen, dass Ihr Quellcode ohne Fehler kompiliert.

An diesem Punkt sollte es ziemlich klar sein, dass Sie den std::string Konstruktor falsch verwenden, was bedeutet, dass Sie ihm die falschen Argumenttypen übergeben. Sie geben ihm etwas, das ein std::string hat (das ist, was std::basic_string ist) und es erwartet etwas, das ein char hat.

Wenn Sie die Dokumentation für std::string konsultieren, werden Sie feststellen, dass es einen Konstruktor gibt, der wie folgt aussieht:

template 
string(InputIterator first, InputIterator last);

Diese Eingabeiteratoren ermöglichen es Ihnen, einen String aus einem Bereich von Zeichen zu erstellen. Sie geben jedoch einen Bereich von std::strings an den Konstruktor weiter. Wenn Sie Ihre istream_iterators in istream_iterator ändern, sollte das den Fehler beheben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X