Por que não consigo instanciar o operador << (ostream &, vetor <T> &) com T = vetor <int>?

Em pensar em Questão do iterador C ++, Escrevi este exemplo de programa:

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

Eu compilo este programa com o gcc e obtenho as 100 linhas de erros típicas. A parte relevante, acredito, é:

it.cc: 19: instanciado a partir daqui

/ usr / include / c ++ / 4.4 / bits / stream_iterator.h: 191: erro: nenhuma correspondência para 'operador <<' em ' ((std :: ostream_iterator>, char, std :: char_traits>) this) -> std :: ostream_iterator>, char, std :: char_traits> :: _ M_stream << __value '

Por que isso falha? No meu modelooperator<<, Tento especificar queany vector, independentemente do tipo, é imprimível. Então, por que nãostd::vector<std::vector<>> impressão

EDITA: O uso do código a seguir na função de modelo faz com 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

questionAnswers(3)

yourAnswerToTheQuestion