Tôi tình cờ tìm ra một vấn đề biên dịch lạ. Tôi muốn xử lý danh sách các chuỗi, sử dụng std::for_each
. Mã đơn giản sau đây minh họa sự cố:std :: for_each bỏ qua đối số hàm mặc định
# include <list>
# include <string>
# include <algorithm>
using namespace std ;
void f(wstring & str)
{
// process str here
}
void g(wstring & str, int dummy = 0)
{
// process str here, same as f, just added a second default dummy argument
}
int main(int, char*[])
{
list<wstring> text ;
text.push_back(L"foo") ;
text.push_back(L"bar") ;
for_each(text.begin(), text.end(), f) ; // OK, fine :)
for_each(text.begin(), text.end(), g) ; // Compilation error, complains about
// g taking 2 arguments, but called within std::for_each
// with only one argument.
// ...
return 0 ;
}
Tôi đã thử nghiệm bằng cách sử dụng MinGW 4.5.2 và MSVC10, cả hai đều báo cáo cùng một thông báo lỗi. Ban đầu, tôi muốn sử dụng boost::algorithm::trim
làm chức năng xử lý được chuyển đến std::for_each
nhưng tôi nhận thấy rằng cần hai đối số, bắt buộc đầu tiên (chuỗi cần xử lý) và thứ hai là tùy chọn (ngôn ngữ cung cấp định nghĩa cho ký tự khoảng trắng) .
Có cách nào để giữ cho mọi thứ sạch sẽ khi sử dụng std::for_each
(và các thuật toán chuẩn khác) khi có chức năng hoặc phương pháp với đối số mặc định không? Tôi tìm thấy một cách để làm cho nó hoạt động, nhưng nó là không rõ ràng và dễ hiểu, do đó, một vòng lặp for
bắt đầu có vẻ dễ dàng hơn ...
# include <list>
# include <string>
# include <algorithm>
# include <boost/bind.hpp>
# include <boost/algorithm/string.hpp>
using namespace std ;
using namespace boost ;
// ... somewhere inside main
list<wstring> text ;
for_each(text.begin(), text.end(), bind(algorithm::trim<wstring>, _1, locale()) ;
// One must deal with default arguments ...
// for_each(text.begin(), text.end(), algorithm::trim<wstring>) would be a real pleasure
Nhờ sự giúp đỡ!
Note: Tôi chỉ mới bắt đầu học tiếng Anh, xin lỗi cho những sai lầm :)
Tôi nghĩ rằng nó chỉ đơn giản là không làm việc theo cách này cho các functors. Xóa đối số giả. –
Đối số giả tôi đã thêm vào 'g' là để chứng minh hành vi kỳ lạ của' std :: for_each'. Gọi 'g' với một số' wstring str' như 'g (str)' hoạt động như một nét duyên dáng, nhưng không phải bên trong 'std :: for_each'. Trong trường hợp của tôi, sử dụng thuật toán 'boost :: :: trim' trực tiếp như hàm functor là không thể nếu không có thủ thuật, vì đối số thứ hai của nó là tùy chọn (một std :: locale) – overcoder
@Overcoder: đó là vì' g (str) 'ngay lập tức trở thành 'g (str, 0)' - đối số mặc định chỉ là đường tạo mã. –