我正在尝试创建一个接受任何类型list
或vector
的函数
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 )
有办法做到这一点吗?
答案 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);
}