[英]Question about vector iterator in template functions
我正在尝试学习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
这似乎是一个非常简单的错误,但我找不到。
您需要说出typename vector<T>::iterator it
。
另一方面,您正在按值传递vector
。 这意味着整个vector
将在函数调用中复制。 void Show(vector<T> const &myvec)
并使用const_iterator
会更明智。
你需要这个:
typename vector<T>::iterator it;
这告诉编译vector<T>::iterator
应将vector<T>::iterator
视为一种类型,由于iterator
取决于T
是什么,因此无法假定该类型。
在模板内部时,某些编译器在检测什么是成员名和什么是类型名时遇到问题。 尝试在模板函数主体的第一行中编写类似的内容。
typename vector<T>::iterator it;
也许使用typename vector<T>::iterator it;
您的编译器无法知道有一个内部类迭代器。
在第一个实例中,参数尽管使用模板,但不是模板,而是完全定义的类( vector<int>
)
在后一种情况下,该参数是类型T上的模板,因此需要类型名
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.