我刚刚编译了GCC 4.6.0,我想尝试新功能,从基于范围的for循环开始。
我想改变的第一个循环是迭代std ::指针向量。我更改了代码以使用新语法,但它没有编译。
我试图用另一个替换for循环,它是在一个std :: vector of structs上,它编译并运行得很完美。
这是一个简短的测试代码,可以向您展示我的问题:
#include <vector>
#include <iostream>
int main()
{
std::vector< int > values;
values.push_back(2);
values.push_back(5);
values.push_back(8);
values.push_back(13);
values.push_back(17);
for (int &n : values)
{
std::cout << n << "\n";
}
std::vector< int* > pointers;
pointers.push_back(new int(2));
pointers.push_back(new int(5));
pointers.push_back(new int(8));
pointers.push_back(new int(13));
pointers.push_back(new int(17));
for ((int*) &p : values)
{
std::cout << (*p) << "\n";
}
for( unsigned int i = 0; i < pointers.size(); ++i)
{
delete pointers[i];
}
return 0;
}
当我尝试编译(是的,我将-std = c ++ 0x作为g ++的参数)时,它会因此错误而死:
main.cpp|27|error: found ‘:’ in nested-name-specifier, expected ‘::’
如果我对27-30行进行评论,那就没关系了。
我做错了什么?指针引用声明语法不正确吗? 或者是否存在包含类型的限制,其中可以使用基于范围的for循环?
感谢您的帮助!
答案 0 :(得分:14)
for ((int*) &p : values)
这是错误的。 (int*)
是一个单独的表达式,所以你需要做int*&
(没有括号,这使得表达式 - 也就是“不是类型名称”)至少使它正确。我更喜欢使用auto或auto&amp;,个人。
你可以这样做:
for (auto p : values) // here p is a pointer, a copy of each pointer
或
for (auto& p : values ) // here p is a non-const reference to a pointer
或
for ( int* p : values ) // here p is a copy of each pointer
或通用代码:
for ( auto&& p: values ) // p is either a const reference to what is in values, or a non-const reference, depends on the context
答案 1 :(得分:1)
我认为你的意思是在那里迭代'指针'而不是'值'......