Размышляя над вопросом об итераторе 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