2011-04-18 22 views
6

Acabo de compilar GCC 4.6.0, y quería probar las nuevas características, comenzando con el bucle for basado en rango.
El primer bucle que quería cambiar era iterar en un std :: vector de punteros. Cambié el código para usar la nueva sintaxis, pero no compiló.C++ 11 basado en rango para un vector de punteros

He intentado sustituir otro ciclo forzado, que estaba en un estándar de estructuras, y se compiló y ejecutó perfectamente.

Aquí hay un código de prueba corta para mostrarle mi problema:

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

Cuando intento compilar (sí, doy -std = C++ 0x como un parámetro para g ++), muere con este error:
main.cpp|27|error: found ‘:’ in nested-name-specifier, expected ‘::’
Si comento las líneas 27-30, está bien.

¿Qué estoy haciendo mal? ¿La referencia de puntero que declara la sintaxis no es correcta?
¿O existe una limitación de los tipos contenidos en los que se pueden usar bucles basados ​​en rangos?

¡Gracias por cualquier ayuda!

+1

En caso de Proba bly se movió a SO –

+2

@Doug: De acuerdo ... y también sería útil si la pregunta incluye definitivamente el código fuente en lugar de tener una pequeña URL. – jprete

Respuesta

13
for ((int*) &p : values) 

Esto está mal. (int*) es una expresión sola, por lo que necesita hacer int*& (sin paréntesis, que hace una expresión, también conocida como "no es un nombre de tipo") al menos para hacerlo correcto. Prefiero usar auto o auto &, personalmente.

Usted puede hacer:

for (auto p : values) // here p is a pointer, a copy of each pointer 

o

for (auto& p : values) // here p is a non-const reference to a pointer 

o

for (int* p : values) // here p is a copy of each pointer 

o en el código genérico:

for (auto&& p: values) // p is either a const reference to what is in values, or a non-const reference, depends on the context 
+2

'for (auto * p: values)' funciona también. – Sjoerd

0

creo que quería decir para repetir 'punteros' en lugar de 'valores' no ...

+0

Lástima que solo se pueda aceptar una respuesta. También estabas en lo cierto, era una tontería escribir valores en lugar de apuntadores, pero el comentario de Klaim era más detallado y mostraba el error con los paréntesis. ¡De todos modos, muchas gracias! – torokati44

Cuestiones relacionadas