2

boost::function でboost::bindを使おうとしたのですが、コンパイルエラーが出てしまいました。関数オブジェクトにプレースホルダーをバインドできないのはなぜですか?

void fun_1(const boost::system::error_code& error)
{
    std::cout<<"test_1------------"<<std::endl;
}
void fun_2(int i)
{
    std::cout<<"tset_2------------"<<std::endl;
}
int main(void)
{
    boost::function0<void> fobj;
    //fobj = boost::bind(&fun_1,boost::asio::placeholders::error);//compile failed
    fobj = boost::bind(&fun_2,5);//syntax is ok
    return 0;
}
4

3 に答える 3

2

署名が一致しません。これを試して:

#include <boost/function.hpp>
#include <boost/asio.hpp>
#include <boost/bind.hpp>

void fun_1(const boost::system::error_code& error)
{
    std::cout<<"test_1------------"<<std::endl;
}
void fun_2(int i)
{
    std::cout<<"tset_2------------"<<std::endl;
}

int main(void)
{
    boost::function<void (const boost::system::error_code&)> fobj;
    fobj = boost::bind(&fun_1,boost::asio::placeholders::error);
    return 0;
}

gcc でテストされたコンパイルg++ main.cpp -lboost_system -lpthread

今後の参考のために、追加すると役立ちます

  • 完全にコンパイル可能な例
  • 完全なコンパイル/リンカー エラー メッセージ

上記のようなスニペットを投稿して、あなたの時間を助けたい人を節約するとき。

于 2012-11-19T08:35:13.087 に答える
2

署名を変更できないerror_code場合は、関数が呼び出されたときに提供できるように、プレースホルダーの代わりにバインドする値を渡す必要があります

すなわち:

#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/asio.hpp>
#include <boost/system/error_code.hpp>

void fun_1(const boost::system::error_code& error)
{
    std::cout<<"test_1------------"<<std::endl;
}
void fun_2(int i)
{
    std::cout<<"tset_2------------"<<std::endl;
}

int main()
{
    boost::function0<void> fobj;
    //fobj = boost::bind(&fun_1,boost::asio::placeholders::error);//compile failed

    fobj = boost::bind( &fun_1,
            boost::system::errc::make_error_code( boost::system::errc::success ) );//compiles ok

    // fobj = boost::bind(&fun_2,5);//syntax is ok
    return 0;
}
于 2012-11-19T10:07:44.360 に答える
0

注: http://my.oschina.net/yellia/blog/90678 を見ると、著者は boost::bind の実装を明確かつ簡単に説明しています。お役に立てば幸いです。哈哈

于 2012-11-21T05:01:15.690 に答える