Reputation: 1493
I have just compiled GCC 4.6.0, and I wanted to try the new features out, starting with the range-based for
loop.
The first loop I wanted to change was iterating on a std::vector
of pointers. I changed the code to use the new syntax, but it didn't compile.
I have tried to substitute another for
loop, which was on a std::vector
of structs, and it compiled and ran perfectly.
Here is a short test code to show you my problem:
#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;
}
When I try to compile it (yes, I give -std=c++0x as a parameter to g++), it dies with this error:
main.cpp|27|error: found ‘:’ in nested-name-specifier, expected ‘::’
If I comment the lines 27–30 out, it's OK.
What am I doing wrong? Isn't the pointer-reference declaring syntax right?
Or is there a limitation of contained types where range-based for
loops can be used?
Upvotes: 12
Views: 16187
Reputation: 69672
for ((int*) &p : values)
This is wrong. (int*)
is an expression alone, so you need to do int*&
(with no parenthesis, that makes an expression - aka "not a type name") at least to make it correct. I prefer to use auto or auto&, personally.
You can do :
for (auto p : values) // here p is a pointer, a copy of each pointer
or
for (auto& p : values ) // here p is a non-const reference to a pointer
or
for ( int* p : values ) // here p is a copy of each pointer
or in generic code:
for ( auto&& p: values ) // p is either a const reference to what is in values, or a non-const reference, depends on the context
Upvotes: 23
Reputation: 121
I think you meant to iterate over 'pointers' instead of 'values' there...
Upvotes: 2