2010-02-08 11 views
9

Obecnie utknąłem, znajdując poprawną składnię do przycinania każdego ciągu w std :: vector.doładowanie :: przycinanie każdego ciągu znaków w std :: vector <std::string>

Próbowałem

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

który dał mi następujące komunikaty o błędach w MSVC7.1.

error C2784: '_Fn1 std :: for_each (_init, _init, _Fn1)': nie można wywnioskować argumentu szablonu dla 'T1' z 'std :: vector <> :: iterator _Ty' z [_Ty = std :: string]: zobacz deklarację "std :: for_each"

błąd C2896: '_Fn1 std :: for_each (_InIt, _InIt, _Fn1)': nie można użyć szablonu funkcji 'void boost :: algorithm :: trim (SequenceT &, const std :: locale &)”jako argument funkcji: patrz deklaracja 'boost :: algorytmu :: wykończenia'

Gdybym wyraźnie dać Parametr drugiego parametru parametru trim nie może zostać znaleziony przez kompilator, chociaż jest ustawiony domyślnie.

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

error C2198: 'void (__cdecl *) (std :: string &, const std :: locale &)': zbyt mało argumentów dla wywołania poprzez wskaźnik do funkcji

Zastanawiam się, jak mogłaby wyglądać poprawna składnia wywołania trim dla każdego elementu w v.

+2

Należy również zauważyć, że 'for_each' nie służy do modyfikowania oryginalnych sekwencje. Zamiast tego użyj "transform". –

+4

Niepoprawnie, for_each jest idealny do tego, co robi. Należy pamiętać, że funkcja boost :: trim zwraca wartość void, co oznacza, że ​​nie można jej użyć z transformacją. – Manuel

+0

Czy w tej sytuacji nie ma boost :: trim_copy? – Rob

Odpowiedz

23

trzeba wiązać także drugi parametr przycięcia (locale):

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

Dzięki. Myślałem też o bindie, ale nie sądziłem, żebym mógł dodać drugi parametr. Bardzo ci pomogłeś. – Norbert

Powiązane problemy