为什么我没有使用基于C ++ 11范围的for循环迭代向量?

时间:2013-01-09 17:55:57

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

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模式下不允许'循环'基于范围”

完全糊涂了,如何迭代它?

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

2 个答案:

答案 0 :(得分:5)

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

  

“C ++ 98模式中不允许使用'基于范围'的循环”

指出这一点。

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

当您看到此消息时:

  

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

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

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

答案 1 :(得分:2)

  

我应该如何在c ++ 98mode中进行迭代?

无论

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);
}