【问题标题】:argument list for class template "std::iterator" is missing缺少类模板“std::iterator”的参数列表
【发布时间】:2020-08-09 18:01:38
【问题描述】:

argument list for class template "std::iterator" is missing

我在这个场合遇到了这个错误:

for(std::iterator it = deque.begin(); it != deque.end(); it++)

所以我想到了以这样的模板方式指定:

for(std::iterator<sf::RectangleShape> it = deque.begin(); it != deque.end(); it++)

然后我得到不同的错误:

expected a declaration

我对这里发生的事情有点困惑。我只需要迭代器,因为这样我就可以到达std::deque 的最后一个元素并将其设置为不同的矩形颜色。

提前致谢。

【问题讨论】:

  • 您是否遵循建议使用 std::iterator 这样的指南?
  • C++ 比较复杂,你应该阅读一些学习资料(最好是good book)。只是有想法,然后当它们不起作用时会感到困惑,这不会让你走得太远。一本书会教你语言背后的原则。
  • 我同意 C++ 很复杂,但我正在尝试学习我可以上网的内容。然而,买一本书是我在不久的将来可能会做的事情。 @约翰
  • 我在 encppreference 上找到的所有内容,如果这就是你所说的“指南”,我可以像这样声明它std::iterator iteratorName 任何示例代码的声明方式都不是我想要的。例如,我知道使用字符串有std::string::iterator,这使得 EDIT 正如我在其他答案中看到的那样,这让事情变得更容易,与我想要完成的事情类似的情况也是如此。 .
  • @logoslavikus 我想知道 cppreference 在哪里可以声明 std::iterator iteratorName,因为这是不正确的。 cppreference 通常非常可靠(尽管并非真正针对初学者)。

标签: c++ iterator sfml


【解决方案1】:

假设您要遍历std::deque&lt;sf::RectangleShape&gt;std::deque&lt;sf::RectangleShape&gt; 容器的非const 成员函数begin()end() 返回的类型既不是std::iterator 也不是std::iterator&lt;sf::RectangleShape&gt;,但实际上std::deque&lt;sf::RectangleShape&gt;::iterator

for (std::deque<sf::RectangleShape>::iterator it = deque.begin(); it != deque.end(); ++it)

正如 this other answer 中已经建议的那样,从 C++11 开始,您可以简单地依赖 auto

for (auto it = deque.begin(); it != deque.end(); ++it)

正如您可能已经注意到的那样,只写auto 而不是std::deque&lt;sf::RectangleShape&gt;::iterator 可能不太容易出错。更好的是,当您遍历整个容器时,从 C++11 开始,您可以使用 range-for loop 代替:

for (auto& elem: deque)

在这种情况下,elem 不是deque 元素的迭代器,而是对元素本身的引用(即sf::RectangleShape&amp;)。

【讨论】:

    【解决方案2】:

    尝试用auto声明迭代器:

    for (auto it = deque.begin(); it != deque.end(); it++)
    

    让编译器为它决定合适的类型。

    【讨论】:

      猜你喜欢
      • 2023-03-07
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      • 2016-09-18
      • 2017-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多