Почему я не могу создать экземпляр оператора << (ostream &, vector &) with T = vector ?

Размышляя над вопросом об итераторе C ++ , я написал этот пример программы:

#include 
#include 
#include 
#include  

template 
std::ostream& operator<<(std::ostream&os, const std::vector& v) 
{ 
    os<<"(";
    std::copy(v.begin(), v.end(), std::ostream_iterator(os, ", "));
    return os<<")";
}

int main()
{
    std::vector v(3);
    std::vector > vv(3, v);
    std::cout << v << "\n"; // this line works
    std::cout << vv << "\n"; // this line produces error
}

Я компилирую эту программу с помощью gcc и получаю типичные 100 строк ошибок. Соответствующая часть, я полагаю, следующая:

it.cc:19: экземпляр создан отсюда

/ usr / include / c ++ / 4.4 / bits / stream_iterator.h: 191: error: нет соответствия для 'operator ((std :: ostream_iterator>, char, std :: char_traits> ) this) -> std :: ostream_iterator>, char, std :: char_traits> :: _ M_stream

Почему это не удается? В моем шаблонном operator я пытаюсь указать, что любой вектор , независимо от типа, можно распечатать. Так почему же std :: vector > не печатает?

EDIT : Использование следующего кода в функции шаблона заставляет его работать

#if 0
    std::copy(v.begin(), v.end(), std::ostream_iterator(os, ", "));
#else
    for(typename std::vector::const_iterator it = v.begin();
        it != v.end();
        it++) {
        os<<(*it)<<", ";
    }
#endif

13
задан Community 23 May 2017 в 10:28
поделиться