Получение контейнера в качестве аргумента шаблона

Я хочу перебрать контейнер внутри некоторой шаблонной функции. Если контейнер deque, но тип, который он хранит, неизвестен, я попытался:

template <typename T>
void PrintDeque(deque<T> d)
{
deque<T>::iterator it; //error here
for(it=d.begin();it!=d.end();it++)
cout<<*it<<" ";
cout<<endl;
}

ИЛИ если я попробую это для неизвестного контейнера:

template <typename T>
void PrintDeque(T d)
{
T::iterator it;   //error here
for(it=d.begin();it!=d.end();it++)
cout<<*it<<" ";
cout<<endl;
}

Оба дают ошибки компиляции. Как создать итератор внутри функции шаблона, чтобы я мог перебирать контейнер?

0

Решение

template <typename T>
void PrintDeque(T d)
{
typename T::iterator it;   //error here
for(it=d.begin();it!=d.end();it++)
cout<<*it<<" ";
cout<<endl;
}

Тебе нужно typename перед этим, потому что компилятор не знает, что вы называете тип или статическую переменную. Это называется зависимым типом.

http://pages.cs.wisc.edu/~driscoll/typename.html

Как в стороне и комментировать другие ответы. Некоторым компиляторам это не нужно, а некоторым это нужно. GCC является одним из компиляторов, которые нуждаются в этом разъяснении.

2

Другие решения

Вы можете использовать этот код:

template <typename T>
void PrintDeque(deque<T> d)
{
deque<T>::iterator it;
for(it=d.begin();it!=d.end();it++)
cout<<*it<<" ";
cout<<endl;
}

Этот код отлично работает на моих окнах с vs12.


Замечания:

template <typename T>
void PrintDeque(deque<T> d)
{
deque<typename T>::iterator it; //error here
for(it=d.begin();it!=d.end();it++)
cout<<*it<<" ";
cout<<endl;
}

этот код, который вы опубликовали, также отлично работает на моем компьютере.

0

#include <deque>
#include <iostream>
using namespace std;

template<typename range>
void PrintEverythingIn(range C)
{
for (auto e : C)
cout << e << ' ';
cout << endl;
}

deque<int> demo { 1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,20 };

int main() { PrintEverythingIn(demo); }
0
По вопросам рекламы [email protected]