2010-09-14 22 views
7

Ich lerne C++. Ich bekomme regelmäßig Fehler, dieSo lesen Sie C++ Fehler mit Vorlagen

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

wie diese aussehen Wie kann ich Sinn daraus machen, so dass ich zumindest etwas Platz für eine Lösung zu suchen haben?

Falls Sie interessiert sind, das Original-Code ist:

#include <iostream> 
#include <fstream> 
#include <string> 
#include <iterator> 

using namespace std; 

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

    istream_iterator<string> begin(ifile); 
    istream_iterator<string> end; 

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

Antwort

6

Dies ist nicht der ganze Fehler, nur eine descripti von einer Instantiierung.

Grundsätzlich kümmern Sie:

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

2) welche Fehler es in (zB cannot convert 'const std::basic_string<char, std::char_traits<char>, std::allocator<char> >' to 'char' in assignment zur Folge hat) und wo

3) Sie könnten vergleichen, was der Compiler sagt, die Template-Parameter sind und was Sie davon halten.

Es braucht wahrscheinlich einige Erfahrung, um nicht vor den Fehlern Angst zu haben, und es hilft sicherlich, die Bibliothek gut zu kennen.

In diesem Fall ist die Ursache, dass der Konstruktor der Zeichenfolge einen Bereich von Zeichen erwartet, aber Sie übergeben einen Bereich von Zeichenfolgen.

5

Verwendung STLFilt.

+0

Lol, das ist genial. Hilft es beim Boosten? Das ist, wo es wirklich gebraucht wird. –

+0

@TED: Ja: http://www.bdsoft.com/dist/vcmeta-demo.txt (es ist besser, aber nicht grandios) –

3

Comeau hat viel viel freundlicher Compiler, überprüfen Sie es online aus: http://www.comeaucomputing.com/tryitout/

zum Beispiel, das ist der Fehler:

Comeau C/C++ 4.3.10.1 (Oct 6 2008 11:28:09) for ONLINE_EVALUATION_BETA2 
Copyright 1988-2008 Comeau Computing. All rights reserved. 
MODE:strict errors C++ C++0x_extensions 

"string", line 1175: error: no suitable conversion function from 
      "const std::string" to "char" exists 
     push_back(*__first); 
       ^
      detected during instantiation of "std::basic_string<_CharT, _Traits, 
        _Alloc> &std::basic_string<_CharT, _Traits, 
        _Alloc>::append(_InputIter, _InputIter, 
        std::input_iterator_tag) [with _CharT=char, 
        _Traits=std::char_traits<char>, 
        _Alloc=std::allocator<char>, 
        _InputIter=std::istream_iterator<std::string, char, 
        std::char_traits<char>, ptrdiff_t>]" at line 624 

1 error detected in the compilation of "ComeauTest.c". 

, die mir den Konstruktor zu übernehmen führt erwartet char iterarator statt Iterator über Strings (wie in vielen Strings):

istream_iterator<char> begin(ifile); 
istream_iterator<char> end; 
+0

Meiner Meinung nach verwirrt der Push_back Teil in Ihrer Fehlermeldung mit meinem Verstand ... In erster Linie hat das nichts mit dem vorliegenden Problem zu tun. Die ersten beiden Zeilen sind aber besser, ich muss zugeben :) – rubenvb

+0

@ruben manchmal mit gut feelinh gehen – Anycorn

2

Sie haben tatsächlich die wichtigsten Teile der Fehlermeldung weggelassen. Sie erhalten zwei doppelte Fehler in g ++ 4.2. Die wichtigsten Teile sind: und str_iter_test.C:15: instantiated from here.

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

istream_iterator<char> begin(ifile); 
istream_iterator<char> end; 
1

Die besondere Fehlermeldung Sie nur einen Teil der von g zeigen sollte ++ ausgegeben Fehler sein:

In diesem Fall sollten Sie Ihre Iteratoren über char nicht string laufen. Der vollständige Fehler sollte etwas näher folgt aussehen (ich habe die Wege verkürzt, und dieser Ausgang von 4.1.2):

basic_string.tcc: In static member function 'static _CharT* std::basic_string<_CharT, _Traits, _Alloc>::_S_construct(_InIterator, _InIterator, const _Alloc&, std::input_iterator_tag) [with _InIterator = std::istream_iterator<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, char, std::char_traits<char>, int>, _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]': 
basic_string.h:1449: instantiated from 'static _CharT* std::basic_string<_CharT, _Traits, _Alloc>::_S_construct_aux(_InIterator, _InIterator, const _Alloc&, __false_type) [with _InIterator = std::istream_iterator<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, char, std::char_traits<char>, int>, _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]' 
basic_string.h:1464: instantiated from 'static _CharT* std::basic_string<_CharT, _Traits, _Alloc>::_S_construct(_InIterator, _InIterator, const _Alloc&) [with _InIterator = std::istream_iterator<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, char, std::char_traits<char>, int>, _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]' 
basic_string.tcc:241: instantiated from 'std::basic_string<_CharT, _Traits, _Alloc>::basic_string(_InputIterator, _InputIterator, const _Alloc&) [with _InputIterator = std::istream_iterator<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, char, std::char_traits<char>, int>, _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]' 
t.cpp:16: instantiated from here 
Line 101: error: cannot convert 'const std::basic_string<char, std::char_traits<char>, std::allocator<char> >' to 'char' in assignment 
compilation terminated due to -Wfatal-errors. 

Das ist nicht viel freundlicher, 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 eigentliche Fehler, dann geben die folgenden Zeilen Brotkrumen durch die Quelle, die zeigen, wie der Compiler dorthin gelangt ist. Die letzte Zeile zeigt, wo in Ihrer Quelle der Fehler war:

t.cpp:16: instantiated from here 
Line 101: error: cannot convert ' 
    const std::basic_string<char, std::char_traits<char>, std::allocator<char> >' to 
    'char' in assignment 

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

string s(begin,end); 

Wenn Sie diese Zeile aus kommentieren (und die Zeile nach ihm, dass verwendet s), finden Sie, dass Ihre Quelle kompiliert ohne Fehler.

An diesem Punkt sollte ziemlich klar sein, dass Sie den std::string -Konstruktor falsch verwenden, was bedeutet, dass Sie es die falschen Arten von Argumenten übergeben. Sie geben es etwas, das eine std::string hat (das ist, was std::basic_string<char> ist) und es erwartet etwas, das eine char hat.

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

template <typename InputIterator> 
string(InputIterator first, InputIterator last); 

Diese Eingabe-Iteratoren können Sie eine Zeichenfolge aus einer Reihe von Zeichen erstellen. Sie übergeben jedoch einen Bereich von std::string s an den Konstruktor. Wenn Sie Ihre istream_iterator<string> s zu istream_iterator<char> ändern, sollte der Fehler beheben.