关于模板函数中矢量迭代器的问题

时间:2011-03-04 11:03:22

标签: c++ templates stl vector iterator

我正在尝试学习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

这似乎是一个非常简单的错误,但我找不到它。

5 个答案:

答案 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