I messaggi di errore relativi ai modelli possono confondere a volte. Il problema è che la libreria standard non definisce un sovraccarico di operator <<
per l'inserimento di std::vector
(o qualsiasi altro contenitore, per quella materia) in un std::ostream
. Quindi il compilatore non riesce a trovare un sovraccarico adatto per operator <<
e segnala questo errore nel miglior modo possibile (che purtroppo non è troppo buono/leggibile nel tuo caso).
Se si desidera eseguire lo streaming di un intero contenitore, è possibile utilizzare std::ostream_iterator
per questo:
auto v = std::vector<int>{1, 2, 3};
std::copy(begin(v), end(v), std::ostream_iterator<int>(std::cout, " "));
quanto riguarda il motivo che stai ricevendo esattamente questo errore criptico, aiuta ad analizzare il messaggio di errore 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)
^
C'è evidentemente un sovraccarico del modello di operator<<
che prende un argomento di tipo ss std::ostream&&
e un argomento RHS o f il tipo di modello; esiste per consentire l'inserimento in flussi temporanei. Dal momento che è un modello, diventa la migliore corrispondenza per l'espressione nel codice. Tuttavia, std::cout
è un lvalue, quindi non può essere associato a std::ostream&&
. Quindi l'errore.
Grazie per la risposta, che spiega la prima parte della domanda. Rotolo il mio codice per stampare anche i vettori. Quello che non capisco (seconda parte della domanda) è come otteniamo questo tipo di errore l-ref/r-ref quando non è possibile trovare un sovraccarico. – tinlyx
@TingL Aggiunta la mia ipotesi sulla natura dell'errore. – Angew
Questo overload non è un dettaglio di implementazione, ma richiesto dalla sinossi standard 27.7.1, per consentire l'inserimento in un flusso temporaneo. Qualcosa come: 'std :: ofstream (" output.txt ") <<" Ciao \ n ";' –