Cách sử dụng liên kết thúc đẩy với chức năng thành viên


77

Đoạn mã sau đây khiến cl.exe bị lỗi (MS VS2005).
Tôi đang cố gắng sử dụng boost bind để tạo một hàm cho một cuộc gọi một phương thức của myclass:

#include "stdafx.h"
#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <functional>

class myclass {
public:
    void fun1()       { printf("fun1()\n");      }
    void fun2(int i)  { printf("fun2(%d)\n", i); }

    void testit() {
        boost::function<void ()>    f1( boost::bind( &myclass::fun1, this ) );
        boost::function<void (int)> f2( boost::bind( &myclass::fun2, this ) ); //fails

        f1();
        f2(111);
    }
};

int main(int argc, char* argv[]) {
    myclass mc;
    mc.testit();
    return 0;
}

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

Câu trả lời:


106

Sử dụng những điều sau thay thế:

boost::function<void (int)> f2( boost::bind( &myclass::fun2, this, _1 ) );

Thao tác này sẽ chuyển tiếp tham số đầu tiên được truyền cho đối tượng hàm đến hàm bằng cách sử dụng các trình giữ chỗ - bạn phải cho Boost biết cách xử lý các tham số. Với biểu thức của bạn, nó sẽ cố gắng diễn giải nó như một hàm thành viên không có đối số.
Xem ví dụ: tại đây hoặc tại đây để biết các mẫu sử dụng phổ biến.

Lưu ý rằng VC8s cl.exe thường xuyên bị lỗi trên Boost.Bind lạm dụng - nếu nghi ngờ, hãy sử dụng trường hợp thử nghiệm với gcc và bạn có thể sẽ nhận được các gợi ý tốt như các tham số mẫu Bind -internals được khởi tạo nếu bạn đọc qua kết quả đầu ra.


bất kỳ cơ hội nào bạn có thể giúp đỡ với stackoverflow.com/questions/13074756/… ? nó tương tự nhưng std::functionđưa ra một lỗi
kirill_igum

Cảm ơn bạn, điều này hơi khó hiểu nhưng câu trả lời của bạn đã cứu được thịt ba chỉ của tôi!
portetherpodcast
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.