2010-02-20 30 views
67

Đoạn mã sau gây cl.exe bị lỗi (MS VS2005).
Tôi cố gắng để sử dụng tăng ràng buộc để tạo ra một chức năng để một gọi một phương pháp myclass:Cách sử dụng liên kết tăng cường với chức năng thành viên

#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?

Trả lời

89

Sử dụng sau đây thay vì:

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

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

Lưu ý rằng VC8s CL.EXE thường xuyên bị treo trên Boost.Bind lạm dụng - nếu nghi ngờ sử dụng một thử nghiệm hợp với gcc và có thể bạn sẽ nhận được gợi ý tốt như các mẫu thông số Bind -internals được khởi tạo với nếu bạn đọc qua đầu ra.

+0

bất kỳ cơ hội nào bạn có thể trợ giúp với http://stackoverflow.com/questions/13074756/how-to-avoid-static-member-function-when-using-gsl-with-c này? nó tương tự nhưng 'std :: function' đưa ra một lỗi –

+0

Cảm ơn bạn, điều này là khó hiểu nhưng câu trả lời của bạn đã lưu thịt xông khói của tôi! – portforwardpodcast

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