c++ - 接收容器作为模板参数

标签 c++ templates g++-4.7

我想在一些模板函数中迭代一个容器。如果容器是双端队列但它存储的类型是未知的,我试过:

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 <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 是确实需要这一说明的编译器之一。

关于c++ - 接收容器作为模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20054631/

相关文章:

c++ - Qt 中的 QDesktopWidget availableGeometry() 无法正常工作,需要垂直滚动才能查看完整图像

python - 如何在Cheetah for Python中正确使用多维字典?

javascript - 代码中没有 html 的 Angularjs 指令?

c++ - 在 C++ 中从模板类派生非模板类时的问题

c++ - 重载 ‘Point_(cv::Point2f&)’ 的调用不明确

C++ 嵌套命名空间别名可能吗?

c++ - 为什么 strlen(s) 与 s 的大小不同,为什么 cout char 显示的是字符而不是数字?

json - JSON 模板中的转义值

C++ 友元运算符重载嵌套枚举的模板参数

c++ - Boost Asio HTTPS 请求给出 'certificate verify failed' 错误