compiler c++ gcc c++11 stl iostream

c++ - compiler - std:: vector: no se puede enlazar ''std:: ostream{alias std:: basic_ostream<char>}'' lvalue a ''std:: basic_ostream<char> &&''



c++11 download (3)

No hay un operator << definido operator << para la clase std::vector en la clase std::basic_ostream .

Lo que quieres es lo siguiente

for ( int x : std::vector<int> { 1, 2, 3 } ) std::cout << x << '' ''; std::cout << std::endl;

Aunque puede escribirse más simple

for ( int x : { 1, 2, 3 } ) std::cout << x << '' ''; std::cout << std::endl;

Encontré un mensaje de error confuso cuando intentaba hacer algo tan simple como

std::cout << std::vector<int>{1,2,3};

que dice

cannot bind ''std::ostream {aka std::basic_ostream<char>}'' lvalue to ''std::basic_ostream<char>&&'' int main() { std::cout << std::vector<int>{1,2,3}; }

(probado usando gcc-4.8.1 con -std = c ++ 11)

SO tiene preguntas similares, como el operador de sobrecarga <<: no puede vincular lvalue a ''std :: basic_ostream <char> &&'' , que trata sobre alguna clase definida por el usuario con clases anidadas. También hay un trabajo alrededor de la respuesta aceptada a esa pregunta.

Pero no sé si esto se aplica a std::vector . ¿Alguien puede explicar por qué ocurre este error con std::vector y cómo interpretarlo?

Gracias


Este es un problema conocido con gcc, presenté una solicitud de mejora con respecto a esto.

El "único" problema es que lo que está intentando imprimir en la consola no tiene operator<< . Lamentablemente, el mensaje de error no es muy útil. :(

Por cierto, la pregunta no tiene nada que ver con referencias vector o l-value y r-value. Un ejemplo mínimo:

#include <iostream> struct A { }; int main() { A a; std::cout << a; }

Vea la discusión en la solicitud de mejora para los detalles sangrientos. En resumen, los desarrolladores de gcc ya habían intentado mejorar el mensaje de error, pero resultó ser notoriamente difícil.

Por lo que vale, el mensaje de error de clang con libc ++ es más claro en mi opinión :

clang++ -std=c++11 -stdlib=libc++ -lc++abi main.cpp && ./a.out main.cpp:7:15: error: invalid operands to binary expression (''ostream'' (aka ''basic_ostream<char>'') and ''A'') std::cout << a; ~~~~~~~~~ ^ ~

Aquí, la primera línea dice claramente cuál es el problema.


Los mensajes de error relacionados con la plantilla pueden ser confusos a veces. El problema es que la biblioteca estándar no define una sobrecarga del operator << para insertar std::vector (o cualquier otro contenedor, para el caso) en std::ostream . Por lo tanto, el compilador no puede encontrar una sobrecarga adecuada para el operator << , e informa sobre esta falla lo mejor que puede (lo que desafortunadamente no es muy bueno / legible en su caso).

Si desea transmitir un contenedor completo, puede usar std::ostream_iterator para eso:

auto v = std::vector<int>{1, 2, 3}; std::copy(begin(v), end(v), std::ostream_iterator<int>(std::cout, " "));

En cuanto a por qué obtiene precisamente este error críptico, ayuda a analizar el mensaje de error completo:

prog.cpp: In function ‘int main()’: prog.cpp:13:37: error: cannot bind ‘std::ostream {aka std::basic_ostream<char>}’ lvalue to ‘std::basic_ostream<char>&&’ std::cout << std::vector<int>{1,2,3}; ^ In file included from /usr/include/c++/4.8/iostream:39:0, from prog.cpp:3: /usr/include/c++/4.8/ostream:602:5: error: initializing argument 1 of ‘std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char; _Traits = std::char_traits<char>; _Tp = std::vector<int>]’ operator<<(basic_ostream<_CharT, _Traits>&& __os, const _Tp& __x) ^

Aparentemente hay una sobrecarga de plantilla del operator<< que toma un argumento std::ostream&& de tipo std::ostream&& y un argumento std::ostream&& del tipo de plantilla; existe para permitir la inserción en flujos temporales. Como es una plantilla, se convierte en la mejor coincidencia para la expresión en su código. Sin embargo, std::cout es un lvalue, por lo que no puede vincularse a std::ostream&& . De ahí el error.