¿Por qué no puedo crear una instancia del operador << (ostream &, vector <T> &) con T = vector <int>?
In pensando en C ++ pregunta del iterador, Escribí este programa de muestra:
#include <vector>
#include <iostream>
#include <iterator>
#include <algorithm>
template <class T>
std::ostream& operator<<(std::ostream&os, const std::vector<T>& v)
{
os<<"(";
std::copy(v.begin(), v.end(), std::ostream_iterator<T>(os, ", "));
return os<<")";
}
int main()
{
std::vector<int> v(3);
std::vector<std::vector<int> > vv(3, v);
std::cout << v << "\n"; // this line works
std::cout << vv << "\n"; // this line produces error
}
Compilo este programa con gcc y obtengo las típicas 100 líneas de errores. La parte relevante, creo, es:
it.cc: 19: instanciado desde aquí
/ usr / include / c ++ / 4.4 / bits / stream_iterator.h: 191: error: no coincide con ‘operador <<’ en ‘ ((std :: ostream_iterator>, char, std :: char_traits>) esto) -> std :: ostream_iterator>, char, std :: char_traits> :: _ M_stream << __value ’
¿Por qué falla esto? En mi plantillaoperator<<
, Trato de especificar que cualquier vector, independientemente del tipo, es imprimible. Entonces, ¿por qué nostd::vector<std::vector<>>
¿impresión
EDITA: El uso del siguiente código en la función de plantilla hace que funcione
#if 0
std::copy(v.begin(), v.end(), std::ostream_iterator<T>(os, ", "));
#else
for(typename std::vector<T>::const_iterator it = v.begin();
it != v.end();
it++) {
os<<(*it)<<", ";
}
#endif