2011-12-16 9 views
7

Stavo cercando di scoprire alcune delle novità del nuovo standard C++ 11 (usando g ++ 4.6.2) . Giocando con Lambdas in una funzione algoritmo "all_of", ho riscontrato uno strano problema con std :: qualifier.C++ 11/g ++: std :: qualificatore richiesto in lambda, anche se "using namespace std" è dato

Sto "utilizzando" lo spazio dei nomi std come mostrato all'inizio dello snippet di codice. Ciò rende ben definita la dichiarazione della variabile pair nel ciclo for.

Tuttavia, ho provato lo stesso nell'argomento lambda utilizzato nell'algoritmo "all_of". Mi sono imbattuto in diversi messaggi di errore di difficile comprensione, prima di rendermi conto che una std :: pair completa std :: pair funzionava lì, ma solo la coppia no.

Mi manca un punto importante? La dichiarazione della lambda avviene in questo file, quindi lo spazio dei nomi dovrebbe essere ancora attivo qui, giusto? O il qualificatore std :: richiesto dipende da qualche codice STL in un file diverso? O è probabile che sia un bug in g ++?

Con i migliori saluti, Peter

PS: il codice viene compilato senza avvisi come incollato qui, ma rimuovendo lo std :: nel lambda all_of, ricevo un messaggio di errore.

#include <iostream> 
#include <memory> 
#include <map> 
#include <string> 
#include <algorithm> 
#include <utility> 

using namespace std; 

void duckburg() { 

const int threshold = 100; 
map <string, int> money; 

money["donald"] = 200; 
money["daisy"] = 400; 
money["scrooge"] = 2000000; 

// obviously, an "auto" type would work here nicely, 
// but this way my problem is illustrated more clearly: 

for (const pair <string, int> &pair : money) { 
    cout << pair.first << "\t" << pair.second << endl; 
} 

if (all_of(money.begin(), money.end(), 
    [&](std::pair<string, int> p) { 
    return bool(p.second > threshold); 
})) 
{ 
    cout << "yes, everyone is rich!"; 
} else { 
    cout << "no, some are poor!"; 
}; 
} 

Modifica: Ho appena notato che ho ricevuto un downvote per questa vecchia domanda. Nessun problema, ma ti preghiamo di approfondire le ragioni. Mi aiuterà a migliorare le domande future e alla fine trarrà profitto l'intera comunità. Grazie!

+3

Sembra un errore in GCC, si integra perfettamente con MSVC 10. Impossibile eseguire il test con Clang, poiché non implementano ancora lambda. FWIW, GCC 4.5.1 non ha problemi con [questo codice minimizzato] (http://ideone.com/LdGJT). – Xeo

+0

sì, avrei provato con/senza il citato std :: in Clang me stesso, ma per ora è impossibile a causa dei lambda mancanti. – Piotr99

+1

È necessario creare una versione con tutto il codice non necessario rimosso e fornire il messaggio di errore. – Mankarse

risposta

8

Rinominare la variabile pair nel ciclo for.

E 'ambito dovrebbe estendersi solo alla fine del ciclo for e quindi non interferire con la lambda, ma g ++ ha un po' di codice per antiche regole per-scoping dove che non era il caso, in modo che possa emettere meglio messaggi di errore per codice C++ antico.

Sembra che ci sia un errore in quel codice di compatibilità.

+0

Sì, grazie! È vero - con un nome di variabile diverso nel ciclo for funziona! Comunque, sono d'accordo con te, dovrebbe essere limitato all'ambito del ciclo ... – Piotr99

+1

Per la cronaca, c'è già un rapporto bug gcc: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=10852 - il lambda rende solo il messaggio di errore peggiore. – wolfgang

+0

wow, buono a sapersi! – Piotr99

Problemi correlati