2010-02-08 38 views
9

Tôi hiện đang bị mắc kẹt khi tìm đúng cú pháp để cắt xén từng chuỗi trong std :: vector.boost :: trim each string in std :: vector <std::string>

tôi đã cố gắng

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

đó đã cho tôi các thông báo lỗi sau đây trong MSVC7.1.

C2784 lỗi: '_Fn1 std :: for_each (_InIt, _InIt, _Fn1)': không thể suy ra mẫu đối số cho 'T1' từ 'std :: vector < _Ty> :: iterator' với [_Ty = std :: string]: xem tuyên bố của 'std :: for_each'

lỗi C2896: '_Fn1 std :: for_each (_InIt, _InIt, _Fn1)': không thể sử dụng thuật toán 'void boost :: algorithm function :: trim (SequenceT &, const std :: locale &)' như một đối số chức năng: xem tuyên bố 'boost :: thuật toán :: cắt'

Nếu tôi một cách rõ ràng cho tham số mẫu trims tham số thứ hai không thể được tìm thấy bởi trình biên dịch, mặc dù thiết lập của nó theo mặc định.

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

C2198 lỗi: 'void (__cdecl *) (std :: string &, std :: const locale &)': quá ít đối số cho cuộc gọi thông qua con trỏ-to-chức năng

Tôi đã tự hỏi làm thế nào cú pháp chính xác để gọi cắt cho mỗi yếu tố trong v sẽ như thế nào.

+2

Lưu ý rằng 'for_each' không được sử dụng để thay đổi trình tự ban đầu. Sử dụng 'transform' để thay thế. –

+4

Sai, for_each là hoàn hảo cho những gì anh ấy đang làm. Hãy nhớ rằng tăng :: trim trả về void, có nghĩa là nó không thể được sử dụng với biến đổi. – Manuel

+0

Không có tăng cường :: trim_copy chỉ dành cho tình huống này? – Rob

Trả lời

23

Bạn cần phải ràng buộc cũng như các tham số thứ hai của trim (miền địa phương): cũng

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

Cảm ơn. Tôi cũng nghĩ về việc ràng buộc, nhưng tôi không nghĩ rằng tôi có thể dễ dàng thêm tham số thứ hai ở đó. Bạn đã giúp rất nhiều. – Norbert

Các vấn đề liên quan