В мыслях о вопросе итератора С++ я написал эту примерную программу:
#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
}
Я скомпилирую эту программу с помощью gcc и получаю типичные 100 строк ошибок. Я считаю, что важная часть:
it.cc:19: созданный здесь
/usr/include/С++/4.4/bits/stream_iterator.h: 191: ошибка: нет соответствия для 'operator < < < in '((std:: ostream_iterator > , char, std:: char_traits > ) this) → std:: ostream_iterator > , char, std:: char_traits > :: _ M_stream < < __value
Почему это не удается? В моем шаблоне operator<<
я пытаюсь указать, что любой вектор, независимо от типа, может быть распечатан. Итак, почему не std::vector<std::vector<>>
печатать?
EDIT: использование следующего кода в функции шаблона заставляет его работать
#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