我正在尝试学习STL库,我遇到了一个奇怪的问题。这段代码完美编译:
void Show(vector<int> myvec)
{
vector<int>::iterator it;
cout << "Vector contains:";
for( it = myvec.begin(); it < myvec.end(); it++)
{
cout << " " << *it;
}
cout << endl;
}
虽然这个在编译时给我一个错误消息:
template <class T>
void Show2(vector<T> myvec)
{
vector<T>::iterator it;
cout << "Vector contains:";
for( it = myvec.begin(); it < myvec.end(); it++)
{
cout << " " << *it;
}
cout << endl;
}
错误是:
$ g++ hello.cpp
hello.cpp: In function ‘void Show2(std::vector<T, std::allocator<_Tp1> >)’:
hello.cpp:19: error: expected ‘;’ before ‘it’
hello.cpp:21: error: ‘it’ was not declared in this scope
这似乎是一个非常简单的错误,但我找不到它。
答案 0 :(得分:28)
您需要说typename vector<T>::iterator it
。
另一方面,您按价值传递vector
秒。这意味着整个vector
被复制到函数调用中。 void Show(vector<T> const &myvec)
并使用const_iterator
会更明智。
答案 1 :(得分:18)
你需要这个:
typename vector<T>::iterator it;
这告诉编译器应该将vector<T>::iterator
视为一种类型,因为iterator
取决于T
是什么,所以它不能假设。
答案 2 :(得分:3)
在模板内部时,某些编译器在检测成员名称和类型名称时遇到问题。尝试在模板函数体的第一行写下这样的东西。
typename vector<T>::iterator it;
答案 3 :(得分:0)
也许它可以使用typename vector<T>::iterator it;
你的编译器不知道有一个内部类迭代器。
答案 4 :(得分:0)
在第一个实例中,参数虽然使用模板,但不是模板,它是一个完全定义的类(vector<int>
)
在后一种情况下,参数是类型T上的模板,因此需要typename