Как определить шаблон шаблона в контейнере и типе?шаблоны классов в качестве параметров шаблона
Например, оператор вставки перегрузки, чтобы передавать все элементы вектора, списка или, вперед итератора контейнера:
using namespace std;
#include <iostream>
#include <vector>
#include <list>
//...
//...the second argument is a container template-ed on type T
//...
template <typename T,template <typename U> class C>
ostream&
operator<<
(ostream& p_os,const C<T>& p_c)
{
for(typename C<typename T>::const_iterator cit=p_c.begin();cit!=p_c.end();++cit)
{
p_os.operator<<(*cit);
}
return p_os;
}
int
main
()
{
vector<int> v;
cout << v << endl;
list<int> l;
cout << l << endl;
return 0;
}
Это не компилируется на г ++ 4.9. Что не так? Как это делается?
Этот подход делает то, что я хотел. Я продлил это, чтобы поддерживать потоки всех типов контейнеров – silvermangb
"(Хотя это может быть неразумно использовать это для глобальных функций, подобных этому, без какой-либо интриги enable_if, поскольку в противном случае он будет соответствовать любому аргументу.)« Я попытался использовать запятую для разделения записи контейнера, но компилятор попытался использовать эту функцию для потоковой передачи строки. Как избежать этого с помощью enable_if? – silvermangb
См. Edit (который фактически не использует 'enable_if'). Для более сложного и мощного решения см. Http://stackoverflow.com/questions/9242209/is-container-trait-fails-on-stdset-sfinae-issue. –