【问题标题】:Question about vector iterator in template functions关于模板函数中向量迭代器的问题
【发布时间】:2011-07-08 18:01:05
【问题描述】:

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

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

【问题讨论】:

  • 之前可能回答了很多,但如果您不知道此类术语存在,则很难搜索类型名称/依赖名称
  • @FredOverflow 这是一个非常好的链接,我现在可能会阅读它。但是,就像@Erik 所说,如果您不知道根本问题是什么,您将搜索许多特定术语,而不是更普遍的问题。我对迭代器、模板、向量、STL 进行了多次搜索……但一无所获,我什至不知道关键字 typename 存在(:( 是的,我是菜鸟 :P)。我以为只是一个愚蠢的语法错误。
  • 没关系,没有人抱怨 ;)

标签: c++ templates stl vector iterator


【解决方案1】:

你需要说typename vector&lt;T&gt;::iterator it

另一方面,您通过值传递vectors。这意味着整个vector 被复制到函数调用中。 void Show(vector&lt;T&gt; const &amp;myvec) 和使用 const_iterator 会更明智。

【讨论】:

  • 如果他传递了一个 const ref,你还需要告诉他使用一个 const_iterator。
【解决方案2】:

你需要这个:

typename vector<T>::iterator it;

这告诉编译器 vector&lt;T&gt;::iterator 应该被视为一种类型,它不能假设这是因为 iterator 取决于 T 是什么。

【讨论】:

    【解决方案3】:

    在模板内部时,某些编译器在检测什么是成员名和什么是类型名时会遇到问题。试着在你的模板函数体的第一行写这样的东西。

    typename vector&lt;T&gt;::iterator it;

    【讨论】:

    • 正确,但这并不是真正的编译器问题。 C++ 标准要求编译器将模板中的从属名称视为成员而不是类型,除非使用了 typename
    • 这不是“某些编译器”。语法根本不允许。 “某些编译器”可以通过在没有它的情况下解析失败并因此编译 一些 不正确的情况时使用 typename 重试来双重猜测程序员。
    【解决方案4】:

    也许它可以使用typename vector&lt;T&gt;::iterator it; 您的编译器无法知道存在内部类迭代器。

    【讨论】:

      【解决方案5】:

      在第一个实例中,参数虽然使用模板,但不是模板,而是完全定义的类 (vector&lt;int&gt;)

      在后一种情况下,参数是类型 T 上的模板,因此需要类型名

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多