C ++列表或任何类型函数的向量

时间:2014-11-26 09:47:25

标签: c++ list vector

我正在尝试创建一个接受任何类型listvector的函数

template <typename T>
void printSomething ( const T& v )
{
    for( T::iterator i = v.begin(); i != v.end(); ++i )
    {
        std::cout << *i << std::endl;
    }
}

我收到了这个错误:

error: need ‘typename’ before ‘T:: iterator’ because ‘T’ is a dependent scope
  for( T::iterator i = v.begin(); i != v.end(); ++i )

有办法做到这一点吗?

3 个答案:

答案 0 :(得分:4)

  

有办法做到这一点吗?

是的,请完全按照错误消息说明。

for( typename T::iterator i = v.begin(); i != v.end(); ++i )
     ^^^^^^^^

iterator的含义取决于模板参数,在实例化模板之前,模板参数是未知的。因此,在模板定义中,编译器不知道它是一个类型名称,除非你告诉它。

答案 1 :(得分:1)

for( T::iterator i = v.begin(); i != v.end(); ++i )

您应该使用typename

作为前缀
typename T::iterator i

因为迭代器依赖于模板参数T ...

答案 2 :(得分:0)

所以你的完整程序将是这样的。

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

template <typename T>
void printSomething ( const T &v )
{
    for( typename T::const_iterator i = v.begin(); i != v.end(); ++i )
    {
        std::cout << *i << std::endl;
    }
}

int main()
{
    vector<int> intV;
    intV.push_back(10);
    intV.push_back(20);
    intV.push_back(30);

    printSomething(intV);

    vector<char> intC;
    intC.push_back('A');
    intC.push_back('B');
    intC.push_back('C');
    printSomething(intC);
}