Шаблонная функция для итераторов шаблонных контейнеров
От: Abulafia  
Дата: 11.03.06 10:51
Оценка:
Здравствуйте!

В программе есть множество всяких множеств , мне необходимо инода
выводить их значения на консоль. Написал простую шаблонную функцию:

template<class T>
std::ostream&
operator<<(std::ostream& st, std::set<T> const& s)
{
     st << '{';
     for(typename std::set<T>::const_iterator i = s.begin();
         i != s.end();
         ++i)
     {
         st << " " << (*i);
     }
     st << '}';
     return st;
}


Теперь можно делать так:

set<int> si;
set<string> ss;
cout << si << ss;
// Всё работает просто на ура!
set<myClass> smc;
cout << smc;
// Работает, если для myClass определён operator<<


Недавно потребовалось хранить в множествах итераторы других контейнеров.
И вот
тут появились проблемы:

   typedef vector<myclass> seq_t;
   typedef seq_t::const_iterator iter_t;
   typedef set<iter_t> set_of_iter_t;
   // Пытаюсь вывести
   set_of_iter_t s;
   cout << s;
   // Правильно, компилятор говорит, что operator << не определен для iter_t


Так вот, вопрос: как написать шаблонную функцию для итераторов?

Пытаюсь сделать так:

template<class T>
std::ostream&
operator<<(std::ostream& st, std::set<T>::const_iterator i)
{
   return st << *i;
}


Но компилятор не находит этот оператор; если же ввести другую функцию с
именем outiter:

template<class T>
void
outiter (std::ostream& st, std::set<T>::const_iterator i)
{
   return st << *i;
}


И вызывать так (для одного элемента):
outiter(cout,  
*s.begin())
,
то компилятор говорит, что не может вывести (Can't deduce) тип параметра
T.

Как правильно сделать?

--
WBR, Abulafia
Posted via RSDN NNTP Server 2.0
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.