2010-10-05 12 views
6

Sto usando un'espressione lambda C++ 0x per modificare i valori di una mappa.Come passare parametri espressione lambda da riferimento per C++ 0x

Tuttavia, avendo difficoltà a passare l'iteratore della mappa per riferimento.

Se ho appena passato l'iteratore, per valore come: [](std::pair<TCHAR, int > iter), esso viene compilato correttamente, ma i valori non vengono aggiornati nella mappa.

Se provo a passare l'iteratore per riferimento, come ad esempio il compilatore VS2010 [](std::pair<TCHAR, int >& iter) lamenta che

cannot convert paramater from 'std::pair<_Ty1,_Ty2>' to 'std::pair<_Ty1,_Ty2> &' 

Ecco il codice. Apprezza le informazioni su come gli oggetti std :: map possono essere modificati utilizzando le espressioni lambda.

#include <tchar.h> 
#include <map> 
#include <algorithm> 
#include <vector> 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
    typedef std::map<TCHAR, int > Map; 

    Map charToInt; 

    charToInt[_T('a')] = 'a'; 
    charToInt[_T('b')] = 'b'; 
    charToInt[_T('c')] = 'c'; 
    charToInt[_T('d')] = 'd'; 

    std::for_each(charToInt.begin(), charToInt.end(), [](std::pair<TCHAR, int >& iter) 
    { 
     int& val = iter.second; 
     val++; 
    }); 

    return 0; 
} 

Grazie

risposta

4

Il problema è che non ti è permesso di modificare la chiave della mappa.

std::for_each(charToInt.begin(), charToInt.end(), [](std::pair<const TCHAR, int>& iter) 

Funzionerà perché utilizza const TCHAR.

Edit:

Come @ David e gli altri utenti hanno fatto notare, si sarebbe meglio utilizzare Map::value_type& che è un typedef per std::pair<const TCHAR, int>& in questo caso, perché se in seguito si modificano i tipi nella mappa si è utilizzando non sarà necessario modificare il codice del loop.

Per riferimento, ecco il messaggio di errore completo, dove si può vedere che sta cercando per la conversione tra due diversi tipi di coppia, uno con TCHAR, l'altra con const TCHAR ...

cannot convert parameter 1 from 'std::pair<_Ty1,_Ty2>' to 'std::pair<_Ty1,_Ty2> &' 
    with 
    [ 
     _Ty1=TCHAR, 
     _Ty2=int 
    ] 
    and 
    [ 
     _Ty1=const TCHAR, 
     _Ty2=int 
    ] 
    and 
    [ 
     _Ty1=TCHAR, 
     _Ty2=int 
    ] 
+3

+1 per la diagnosi di problemi HTE, ma una soluzione migliore sarebbe utilizzando 'Map :: value_type &' come l'intento è più chiara e meno soggetto a errori. –

+0

Grazie - i suggerimenti stanno funzionando. –

1

Sei non passa un iteratore, sei cercando di passare un riferimento a map::value_type. Il codice come pubblicato non dovrebbe nemmeno compilare. Passa al numero map::value_type&, quindi il programma deve incrementare il valore int memorizzato nella mappa.