2010-05-07 7 views
5

Tôi muốn để ràng buộc các nhà điều hành < < dòng:boost :: ràng buộc và << nhà điều hành trong C++

for_each(begin, end, boost::bind(&operator<<, stream, _1)); 

Đáng tiếc là nó không hoạt động:

Error 1 error C2780: 'boost::_bi::bind_t<_bi::dm_result<MT::* ,A1>::type,boost::_mfi::dm<M,T>,_bi::list_av_1<A1>::type> boost::bind(M T::* ,A1)' : expects 2 arguments - 3 provided c:\source\repository\repository\positions.cpp 90 

Tôi đang làm gì sai?

Trả lời

8

Thay vào đó bạn có thể thử boost.lambda:

//using namespace boost::lambda; 
for_each(begin, end, stream << _1)); 

Nguyên nhân của vấn đề của bạn có lẽ là nhất: làm thế nào trên trái đất bạn có thể mong đợi các trình biên dịch/liên kết để biết bạn đang sử dụng địa chỉ nào nếu bạn nói &operator<<? (Tôi nhận được một lỗi khác nhau chỉ đơn giản nói rằng điều này là không công bố.)


Nếu bạn thực sự muốn làm điều đó với ràng buộc, bạn phải nói với nó mà operator<< bạn muốn sử dụng, ví dụ như giả định int (bạn cũng sẽ cần phải biết, toán tử bị quá tải là thành viên hoặc chức năng miễn phí):

bind(static_cast<std::ostream& (std::ostream::*)(int)>(&std::ostream::operator<<), ref(std::cout), _1) 
5

Bạn có thể sử dụng thay vì ostream_iterator:

vector<int> V; 
// ... 
copy(V.begin(), V.end(), ostream_iterator<int>(cout, "\n"));