부스트 바인딩 사용 부스트 고유 포인터 및 부스트 기능 수신 함수에 콜백을 전달하는 방법에 따라 링커 오류가 발생합니다.
부스트 고유 포인터 param을 포함하는 콜백을 바인딩하여 부스트 함수 멤버 변수를 만들고이를 수신 함수에 전달하면 콜백 호출시 고유 포인터를 사용하려고 할 때 링커 오류가 발생합니다.부스트 사용시 링커 오류 부스트 바인딩 및 부스트 기능이있는 고유 포인터
수신 기능을 호출 할 때 제 위치에서 바인드를 수행하면 링커 오류가 발생하지 않고 코드가 예상대로 작동합니다.
샘플 코드 :
class test
{
public:
test() : callback_(boost::bind(&test::callback, this, _1, _2))
void start()
{
// using boost function pointer,
// this fails with linker errors
accept(callback_); // (Method 1)
// using in place bind
// this is OK
accept(boost::bind(&test::callback, this, _1, _2)); // (Method 2)
}
void callback(BOOST_RV_REF(boost::movelib::unique_ptr<message>) message,
int version)
{
// attempting to use message if implemented as (Method 1) will result in linker errors
message->get_body(); // If I comment out this line then both methods compile and link???
}
boost::function
< void (BOOST_RV_REF(boost::movelib::unique_ptr <message>) message,
int version) > callback_;
};
class callback_tester
{
callback_tester(){};
void accept(boost::function
< void (BOOST_RV_REF(boost::movelib::unique_ptr <message>) message,
int version) callback)
{
// Assignment to local member variable is fine here so we
// can invoke the callback at a later stage.
test_callback_ = callback;
test_callback_(boost::move(message_), version_);
}
// define handler to store and invoke test callback
boost::function
< void (BOOST_RV_REF(boost::movelib::unique_ptr <message>) message,
int version) > test_callback_;
boost::movelib::unique_ptr<message> message_;
int version_;
};
다음과 같이 링커 오류 중 일부는 다음과 같습니다
Error: symbol `_ZN5boost8functionIFvRKNS_6system10error_codeERNS_2rvINS_7movelib10unique_ptrIN5cayan3hal7network10tcp_socketENS6_14default_deleteISB_EEEEEEEED2Ev' is already defined
Error: symbol `_ZN5boost9function2IvRKNS_6system10error_codeERNS_2rvINS_7movelib10unique_ptrIN5cayan3hal7network10tcp_socketENS6_14default_deleteISB_EEEEEEED2Ev' is already defined
Error: symbol `_ZNSt15binary_functionIRKN5boost6system10error_codeERNS0_2rvINS0_7movelib10unique_ptrIN5cayan3hal7network10tcp_socketENS6_14default_deleteISB_EEEEEEvEC2Ev' is already defined
...
사람이 링커 오류는 때 나타나는 이유를 두 가지 방법의 차이가 무엇을 말해 줄 수 방법 1을 사용할 때 고유 포인터에 액세스하려고합니까?
나는 콜백이 CopyConstructible에서 boost :: function과 함께 사용해야한다는 정보를 발견했다. 그러나 이것이 사실이라면 두 가지 방법 모두에서 고유 포인터가 포함 된 콜백을 바인드하고 전달할 것으로 예상됩니다.