【问题标题】:Why am I failing to iterate a vector using a C++11 range-based for loop?为什么我无法使用基于 C++11 范围的 for 循环来迭代向量?
【发布时间】:2013-01-09 17:55:57
【问题描述】:
std::vector<std::string> endpointLSRKey;

for(auto it = endpointLSRKey.begin(); it != endpointLSRKey.end(); ++it) {
        lsr->setItem(0, "", *it, address);
    }

然后得到一个错误说“auto”已经改变了c++11中的含义,删除它!

所以我改成这样:

for(std::string& str : endpointLSRKey){
        lsr->setItem(0, "", str, address);
    }

然后出现错误提示“C++98 模式下不允许基于范围的 'for' 循环”

一头雾水,怎么迭代??

为什么有时是 c++11 而有时是 c++98?

【问题讨论】:

  • 看来您没有在 C++11 模式下编译。在 C++98 中, auto 具有已被删除的(大部分无用的)含义,并且它也没有基于范围的 for 循环。这意味着您在 C++98 模式下编译,而不是 C++11 模式。
  • 你用的是什么编译器?如果是 GCC(我也认为是 clang),请添加标志 -std=c++0x
  • 什么编译器,什么设置?
  • @sharth 那么我应该如何在 c++98mode 中进行迭代?谢谢
  • std::vector&lt;std::string&gt;::iterator it = endpointLSRKey.begin(); ...

标签: c++ c++11 vector iterator c++98


【解决方案1】:

听起来您需要将编译器设置为 C++11 模式。错误信息:

“C++98 模式下不允许基于范围的 'for' 循环”

指出这一点。

您执行此操作的方式取决于您的编译器。

当您看到此消息时:

得到一个错误说“auto”已经改变了c++11中的含义

您的编译器仍处于 C++98/03 模式。关键字auto 存在于C++03 中,但在大多数情况下它没有任何意义,因为默认情况下变量会自动存储。 (您可以通过用static 标记变量来使变量进入静态存储。也就是说,auto 对应于static,就像signed 对应于unsigned(在 C++98/03 中)。

因为这个含义在 C++98/03 中并不是真正有用,并且因为在 C++11 中含义发生了变化,所以 C++03 模式下的编译器可能会抱怨使用 auto 并发出警告。如果您将警告视为错误,则会变成错误。因此,您看到的消息。

【讨论】:

    【解决方案2】:

    在c++98模式下应该如何迭代?

    要么

    for(std::vector<std::string>::iterator it = endpointLSRKey.begin(); it != endpointLSRKey.end(); ++it) {
        lsr->setItem(0, "", *it, address);
    }
    

    或

    for(std::size_t i = 0; i < endpointLSRKey.size(); ++i) {
        lsr->setItem(0, "", endpointLSRKey[i], address);
    }
    

    【讨论】:

      猜你喜欢
      • 2021-04-08
      • 1970-01-01
      • 1970-01-01
      • 2015-11-20
      • 2022-01-14
      • 1970-01-01
      相关资源
      最近更新 更多