正在接收容器作为模板参数

Receiving container as template argument

本文关键字:参数      更新时间:2023-10-16

我想在某个模板函数中迭代一个容器。如果容器是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;
}

两者都会产生编译错误。如何在template函数中创建迭代器,以便对容器进行迭代?

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是需要澄清的编译器之一。

#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); }

您可以使用以下代码:

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;
}

你发布的这段代码在我的电脑上也运行良好。