2010-02-08 11 views
9

Sono attualmente bloccato trovando la sintassi corretta per tagliare ogni stringa in uno std :: vector.boost :: tagliare ogni stringa di std :: vector <std::string>

ho cercato

std::vector<std::string> v; 
std::for_each(v.begin(), v.end(), &boost::trim); 

che mi ha dato i seguenti messaggi di errore in MSVC7.1.

errore C2784: '_Fn1 std :: for_each (_init, _init, _Fn1)': non poteva dedurre argomento di template per 'T1' da 'std :: vector < _Ty> :: iterator' con [_Ty = std :: string]: vedere la dichiarazione di 'std :: for_each'

errore C2896: '_Fn1 std :: for_each (_InIt, _InIt, _Fn1)': impossibile utilizzare il modello di funzione 'void boost :: algorithm :: trim (SequenceT &, std :: const locale &)' come argomento di funzione: vedi dichiarazione di 'boost :: :: algoritmo assetto'

Se io do in modo esplicito il parametro del trim del parametro template non può essere trovato dal compilatore, anche se è impostato di default.

std::for_each(v.begin(), v.end(), &boost::trim<std::string>); 

errore C2198: 'void (__cdecl *) (std :: string &, std :: const locale &)': troppo pochi argomenti per chiamata tramite puntatore a funzione

mi chiedevo come la sintassi corretta per chiamare assetto per ogni elemento in v sarebbe simile.

+2

Si noti inoltre che 'for_each' non viene utilizzato per modificare le sequenze originali. Usa 'transform' invece. –

+4

Sbagliato, for_each è perfetto per quello che sta facendo. Tieni presente che boost :: trim restituisce void, il che significa che non può essere utilizzato con la trasformazione. – Manuel

+0

Non c'è un boost :: trim_copy solo per questa situazione? – Rob

risposta

23

hai bisogno di impegnare oltre il secondo parametro di assetto (il locale):

std::vector<std::string> v; 
std::for_each(v.begin(), v.end(), 
       boost::bind(&boost::trim<std::string>, 
          _1, std::locale())); 
+0

Grazie. Ho pensato anche al binding, ma non pensavo di poter aggiungere facilmente il secondo parametro lì. Hai aiutato molto. – Norbert

Problemi correlati