2010-09-14 15 views
7

Estoy aprendiendo C++. Regularmente recibo errores que se ven asíCómo leer errores de C++ con plantillas

/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]'

¿Cómo dar sentido a esto para que al menos puedo tener un lugar para buscar una solución?

En caso de que esté interesado, el código original es:

#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; 
} 

Respuesta

6

Esto no es todo el error, solo una descripción de una instanciación.

Básicamente se preocupan por:

1) que la línea en su código desencadenó el error (string s(begin,end);)

2) qué error te fue como resultado (por ejemplo cannot convert 'const std::basic_string<char, std::char_traits<char>, std::allocator<char> >' to 'char' in assignment) y donde

3) podría comparar lo que el compilador dice sobre los parámetros de la plantilla y lo que usted supone que son.

Probablemente se requiera cierta experiencia para no tenerle miedo a los errores, y ciertamente ayuda a conocer bien la biblioteca.

En este caso, la causa es que el constructor de la cadena espera un rango de caracteres, pero está pasando un rango de cadenas.

5

Uso STLFilt.

+0

Lol, eso es increíble. ¿Ayuda con el impulso? Ahí es donde realmente se necesita. –

+0

@TED: Sí: http://www.bdsoft.com/dist/vcmeta-demo.txt (es mejor, pero no fenomenal) –

3

Comeau tiene mucho mucho más amigable compilador, comprobar que funciona en línea: http://www.comeaucomputing.com/tryitout/

por ejemplo, este es el error:

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". 

que me lleva a suponer que el constructor espera charla iterarator en lugar de iterador sobre cadenas (como en muchas cadenas):

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

En mi opinión, la parte push_back en su mensaje de error se confunde con mi mente ... En primera instancia, no tiene nada que ver con el problema en cuestión. Las dos primeras líneas son mejores, tengo que admitir :) – rubenvb

+0

@ruben a veces tiene que ir con instinto – Anycorn

2

De hecho, omitió las partes clave del mensaje de error. Obtiene dos errores duplicados en g ++ 4.2. Las partes clave son: /path/basic_string.tcc:103: error: cannot convert 'const std::basic_string<char, std::char_traits<char>, std::allocator<char> >' to 'char' in assignment y str_iter_test.C:15: instantiated from here.

La primera parte significa que no se pudo convertir de cadena a char, y la segunda parte dice en qué línea se produjo el error, en este caso string s(begin,end);.

En este caso, los iteradores debe iterar sobre char no string:

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

El mensaje de error en particular mostrar sólo debe ser parte del error emitido por g ++. El error total debe ser algo más cerca de lo siguiente (he acortado los caminos, y esta salida es desde 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. 

Eso no es mucho más agradable, ¿verdad? :-) Las líneas útiles en el error son las líneas al final, no las líneas al principio.El mensaje de error se emite en orden inverso: el primer error es el error real, luego las líneas siguientes le dan migas de pan a través de la fuente que muestra cómo llegó el compilador. La última línea muestra donde en su fuente era el error:

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 

En mi archivo de ejemplo, t.cpp:16 es la siguiente línea:

string s(begin,end); 

Si usted comenta que la línea (y la línea siguiente de esa usa s), encontrará que su fuente compila sin error.

En este punto, debe quedar bastante claro que está utilizando el constructor std::string incorrectamente, lo que significa que está pasando los tipos de argumentos incorrectos. Le está dando algo que tiene un std::string (eso es lo que std::basic_string<char> es) y está esperando algo que tenga un char.

Si se consulta la documentación de std::string, encontrará que tiene un constructor que se parece a:

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

Esos iteradores de entrada le permiten crear una cadena de una serie de caracteres. Sin embargo, usted está pasando un rango de std::string s al constructor. Si cambia su istream_iterator<string> s al istream_iterator<char>, esto debería corregir el error.