【问题标题】:Boost::bind compile error when trying to set member function for boost::::asio::deadline_timer尝试为 boost::::asio::deadline_timer 设置成员函数时,Boost::bind 编译错误
【发布时间】:2023-03-25 19:48:01
【问题描述】:

我在理解尝试创建 boost::asio::deadline_timer 时遇到的编译错误时遇到了一些问题。我在 MSVC10 上使用以下代码示例得到以下错误。它是用 Boost 1.48 构建的

第一个错误看起来像是在抱怨将成员函数设置为 async_wait 的处理程序作为引用。但是,当我更改参数时,它会给出类似的错误。

我一直在查看 Boost::Bind 和 Boost::Asio 试图找出我做错了什么。我的代码类似于this 示例,我使用bind 和deadline_timer 的方式。

很抱歉编译错误看起来很混乱。我仍在尝试处理 Markdown。

代码示例

包括

#include <boost/thread.hpp>
#include <boost/bind.hpp>
#include <boost/asio.hpp>
#include <boost/system/error_code.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

class TimerThing
{
protected:
    boost::asio::deadline_timer* statusTimer_;
    boost::thread_group worker_threads_;

    boost::asio::io_service io_service_;
    boost::shared_ptr<boost::asio::io_service::work> work_;

public:
    TimerThing() {}

    virtual ~TimerThing(){}

    void updateStatus(boost::system::error_code& ec)
    {
        if (ec == boost::asio::error::operation_aborted)
            return;

        std::cout<<"Status Update"<<std::endl;

        statusTimer_->expires_at(statusTimer_->expires_at() + boost::posix_time::seconds(1));
        statusTimer_->async_wait(boost::bind(&TimerThing::updateStatus, this, , boost::asio::placeholders::error));
    }

    void start()
    {
        statusTimer_=new boost::asio::deadline_timer(io_service_);
        boost::shared_ptr<boost::asio::io_service::work> myWork(new boost::asio::io_service::work(io_service_));
        work_=myWork;

        worker_threads_.create_thread( boost::bind( &TimerThing::threadAction, this ) );

        statusTimer_->expires_at(statusTimer_->expires_at() + boost::posix_time::seconds(1));
        statusTimer_->async_wait(boost::bind(&TimerThing::updateStatus, this, boost::asio::placeholders::error));
    }

    void threadAction()
    {
        io_service_.run();
    }

    void stop()
    {
        work_.reset();
        io_service_.stop();
        worker_threads_.join_all();

        delete statusTimer_;
    }

};



#include "TimerThing.h"

int main(int argc, const char* argv[] )
{
    TimerThing t;

    std::string input;
    std::cout<<"Press f to stop"<<std::endl;

    t.start();

    std::cin>>input;

    t.stop();

    return 0;
}

编译器错误

c:\Underware\version\include\boost/bind/bind.hpp(313): 错误 C2664: 'R boost::_mfi::mf1::operator ()(const U &,A1) const' :无法将参数 2 从 'const boost::system::error_code' 转换为 'boost::system::error_code &'

     with
     [
         R=void,
         T=TimerThing,
         A1=boost::system::error_code &,
         U=TimerThing *
     ]
     Conversion loses qualifiers
     c:\Underware\version\include\boost/bind/bind_template.hpp(47) : see reference to function template instantiation 'void boost::_bi::list2<A1,A2>::operator ()<F,boost::_bi::list1<const boost::system::error_code &>>(boost::_bi::type<T>,F &,A &,int)' being compiled
     with
     [
         A1=boost::_bi::value<TimerThing *>,
         A2=boost::arg<1>,
         F=boost::_mfi::mf1<void,TimerThing,boost::system::error_code &>,
         T=void,
         A=boost::_bi::list1<const boost::system::error_code &>
     ]
     c:\Underware\version\include\boost/asio/detail/bind_handler.hpp(46) : see reference to function template instantiation 'void boost::_bi::bind_t<R,F,L>::operator ()<const Arg1>(const A1 &)' being compiled
     with
     [
         R=void,
         F=boost::_mfi::mf1<void,TimerThing,boost::system::error_code &>,
         L=boost::_bi::list2<boost::_bi::value<TimerThing *>,boost::arg<1>>,
         Arg1=const boost::system::error_code,
         A1=const boost::system::error_code
     ]

     c:\Underware\version\include\boost/asio/detail/bind_handler.hpp(45) : while compiling class template member function 'void boost::asio::detail::binder1<Handler,Arg1>::operator ()(void)'
     with
     [
         Handler=boost::_bi::bind_t<void,boost::_mfi::mf1<void,TimerThing,boost::system::error_code &>,boost::_bi::list2<boost::_bi::value<TimerThing *>,boost::arg<1>>>,
         Arg1=boost::system::error_code
     ]
     c:\Underware\version\include\boost/asio/detail/wait_handler.hpp(59) : see reference to class template instantiation 'boost::asio::detail::binder1<Handler,Arg1>' being compiled
     with
     [
         Handler=boost::_bi::bind_t<void,boost::_mfi::mf1<void,TimerThing,boost::system::error_code &>,boost::_bi::list2<boost::_bi::value<TimerThing *>,boost::arg<1>>>,
         Arg1=boost::system::error_code
     ]

     c:\Underware\version\include\boost/asio/detail/wait_handler.hpp(45) : while compiling class template member function 'void boost::asio::detail::wait_handler<Handler>::do_complete(boost::asio::detail::io_service_impl *,boost::asio::detail::operation *,const boost::system::error_code &,size_t)'
     with
     [
         Handler=boost::_bi::bind_t<void,boost::_mfi::mf1<void,TimerThing,boost::system::error_code &>,boost::_bi::list2<boost::_bi::value<TimerThing *>,boost::arg<1>>>
     ]
     c:\Underware\version\include\boost/asio/detail/deadline_timer_service.hpp(185) : see reference to class template instantiation 'boost::asio::detail::wait_handler<Handler>' being compiled
     with
     [
         Handler=boost::_bi::bind_t<void,boost::_mfi::mf1<void,TimerThing,boost::system::error_code &>,boost::_bi::list2<boost::_bi::value<TimerThing *>,boost::arg<1>>>
     ]
     c:\Underware\version\include\boost/asio/deadline_timer_service.hpp(137) : see reference to function template instantiation 'void boost::asio::detail::deadline_timer_service<Time_Traits>::async_wait<WaitHandler>(boost::asio::detail::deadline_timer_service<Time_Traits>::implementation_type &,Handler)' being compiled
     with
     [
         Time_Traits=boost::asio::time_traits<boost::posix_time::ptime>,
         WaitHandler=boost::_bi::bind_t<void,boost::_mfi::mf1<void,TimerThing,boost::system::error_code &>,boost::_bi::list2<boost::_bi::value<TimerThing *>,boost::arg<1>>>,
         Handler=boost::_bi::bind_t<void,boost::_mfi::mf1<void,TimerThing,boost::system::error_code &>,boost::_bi::list2<boost::_bi::value<TimerThing *>,boost::arg<1>>>
     ]
     c:\Underware\version\include\boost/asio/basic_deadline_timer.hpp(502) : see reference to function template instantiation 'void boost::asio::deadline_timer_service<TimeType,TimeTraits>::async_wait<WaitHandler>(boost::asio::detail::deadline_timer_service<Time_Traits>::implementation_type &,const WaitHandler &)' being compiled
     with
     [
         TimeType=boost::posix_time::ptime,
         TimeTraits=boost::asio::time_traits<boost::posix_time::ptime>,
         WaitHandler=boost::_bi::bind_t<void,boost::_mfi::mf1<void,TimerThing,boost::system::error_code &>,boost::_bi::list2<boost::_bi::value<TimerThing *>,boost::arg<1>>>,
         Time_Traits=boost::asio::time_traits<boost::posix_time::ptime>
     ]

c:\users\tharper\documents\visual studio 2010\projects\asiotimer\asiotimer\TimerThing.h(48) :参见对函数模板实例化的参考 'void boost::asio::basic_deadline_timer::async_wait>(const WaitHandler &)' 正在编译中

     with
     [
         Time=boost::posix_time::ptime,
         R=void,
         F=boost::_mfi::mf1<void,TimerThing,boost::system::error_code &>,
         L=boost::_bi::list2<boost::_bi::value<TimerThing *>,boost::arg<1>>,

WaitHandler=boost::_bi::bind_t,boost::_bi::list2,boost::arg>>
] TimerThing.cpp

c:\Underware\version\include\boost/bind/bind.hpp(313): 错误 C2664: 'R boost::_mfi::mf1::operator ()(const U &,A1) const' :无法将参数 2 从 'const boost::system::error_code' 转换为 'boost::system::error_code &'

     with
     [
         R=void,
         T=TimerThing,
         A1=boost::system::error_code &,
         U=TimerThing *
     ]
     Conversion loses qualifiers

c:\Underware\version\include\boost/bind/bind_template.hpp(47) : 参见函数模板实例化 'void boost::_bi::list2::operator ()>(boost::_bi: :type,F &,A &,int)' 正在编译

     with
     [
         A1=boost::_bi::value<TimerThing *>,
         A2=boost::arg<1>,
         F=boost::_mfi::mf1<void,TimerThing,boost::system::error_code &>,
         T=void,
         A=boost::_bi::list1<const boost::system::error_code &>
     ]
     c:\Underware\version\include\boost/asio/detail/bind_handler.hpp(46) : see reference to function template instantiation 'void boost::_bi::bind_t<R,F,L>::operator ()<const Arg1>(const A1 &)' being compiled
     with
     [
         R=void,
         F=boost::_mfi::mf1<void,TimerThing,boost::system::error_code &>,
         L=boost::_bi::list2<boost::_bi::value<TimerThing *>,boost::arg<>>,
         Arg1=const boost::system::error_code,
         A1=const boost::system::error_code
     ]
     c:\Underware\version\include\boost/asio/detail/bind_handler.hpp(45) : while compiling class template member function 'void boost::asio::detail::binder1<Handler,Arg1>::operator ()(void)'
     with
     [
         Handler=boost::_bi::bind_t<void,boost::_mfi::mf1<void,TimerThing,boost::system::error_code &>,boost::_bi::list2<boost::_bi::value<TimerThing *>,boost::arg<1>>>,
         Arg1=boost::system::error_code
     ]
     c:\Underware\version\include\boost/asio/detail/wait_handler.hpp(59) : see reference to class template instantiation 'boost::asio::detail::binder1<Handler,Arg1>' being compiled
     with
     [
         Handler=boost::_bi::bind_t<void,boost::_mfi::mf1<void,TimerThing,boost::system::error_code &>,boost::_bi::list2<boost::_bi::value<TimerThing *>,boost::arg<1>>>,
         Arg1=boost::system::error_code
     ]
     c:\Underware\version\include\boost/asio/detail/wait_handler.hpp(45) : while compiling class template member function 'void boost::asio::detail::wait_handler<Handler>::do_complete(boost::asio::detail::io_service_impl *,boost::asio::detail::operation *,const boost::system::error_code &,size_t)'
     with
     [
         Handler=boost::_bi::bind_t<void,boost::_mfi::mf1<void,TimerThing,boost::system::error_code &>,boost::_bi::list2<boost::_bi::value<TimerThing *>,boost::arg<1>>>
     ]
     c:\Underware\version\include\boost/asio/detail/deadline_timer_service.hpp(185) : see reference to class template instantiation 'boost::asio::detail::wait_handler<Handler>' being compiled
     with
     [
         Handler=boost::_bi::bind_t<void,boost::_mfi::mf1<void,TimerThing,boost::system::error_code &>,boost::_bi::list2<boost::_bi::value<TimerThing *>,boost::arg<1>>>
     ]
     c:\Underware\version\include\boost/asio/deadline_timer_service.hpp(137) : see reference to function template instantiation 'void boost::asio::detail::deadline_timer_service<Time_Traits>::async_wait<WaitHandler>(boost::asio::detail::deadline_timer_service<Time_Traits>::implementation_type &,Handler)' being compiled
     with
     [
         Time_Traits=boost::asio::time_traits<boost::posix_time::ptime>,
         WaitHandler=boost::_bi::bind_t<void,boost::_mfi::mf1<void,TimerThing,boost::system::error_code &>,boost::_bi::list2<boost::_bi::value<TimerThing *>,boost::arg<1>>>,
         Handler=boost::_bi::bind_t<void,boost::_mfi::mf1<void,TimerThing,boost::system::error_code &>,boost::_bi::list2<boost::_bi::value<TimerThing *>,boost::arg<1>>>
     ]
     c:\Underware\version\include\boost/asio/basic_deadline_timer.hpp(502) : see reference to function template instantiation 'void boost::asio::deadline_timer_service<TimeType,TimeTraits>::async_wait<WaitHandler>(boost::asio::detail::deadline_timer_service<Time_Traits>::implementation_type &,const WaitHandler &)' being compiled
     with
     [
         TimeType=boost::posix_time::ptime,
         TimeTraits=boost::asio::time_traits<boost::posix_time::ptime>,
         WaitHandler=boost::_bi::bind_t<void,boost::_mfi::mf1<void,TimerThing,boost::system::error_code &>,boost::_bi::list2<boost::_bi::value<TimerThing *>,boost::arg<1>>>,
         Time_Traits=boost::asio::time_traits<boost::posix_time::ptime>
     ]
     c:\users\tharper\documents\visual studio 2010\projects\asiotimer\asiotimer\TimerThing.h(48) : see reference to function template instantiation 'void boost::asio::basic_deadline_timer<Time>::async_wait<boost::_bi::bind_t<R,F,L>>(const WaitHandler &)' being compiled
     with
     [
         Time=boost::posix_time::ptime,
         R=void,
         F=boost::_mfi::mf1<void,TimerThing,boost::system::error_code &>,
         L=boost::_bi::list2<boost::_bi::value<TimerThing *>,boost::arg<1>>,
         WaitHandler=boost::_bi::bind_t<void,boost::_mfi::mf1<void,TimerThing,boost::system::error_code &>,boost::_bi::list2<boost::_bi::value<TimerThing *>,boost::arg<1>>>
     ]

【问题讨论】:

  • void updateStatus(boost::system::error_code&amp; ec) 应该是无效的updateStatus(const boost::system::error_code&amp; ec)boost::bind(&amp;TimerThing::updateStatus, this, , boost::asio::placeholders::error)); 中有多余的逗号
  • @IgorR。谢谢,谢谢,谢谢,谢谢,谢谢!!! const 是问题所在。你应该把评论变成一个答案,这样你才能获得荣誉。

标签: boost boost-asio boost-bind


【解决方案1】:

void updateStatus(boost::system::error_code&amp; ec) 应该是void updateStatus(const boost::system::error_code&amp; ec)

boost::bind(&amp;TimerThing::updateStatus, this, , boost::asio::placeholders::error)); 中有多余的逗号

【讨论】:

    【解决方案2】:

    start 中的绑定是正确的,updateStatus 中的绑定不正确:

    void updateStatus(const boost::system::error_code& ec)
    {
        if (ec == boost::asio::error::operation_aborted)
            return;
    
        std::cout<<"Status Update"<<std::endl;
    
        statusTimer_->expires_at(
          statusTimer_->expires_at() + boost::posix_time::seconds(1));
        statusTimer_->async_wait(
          boost::bind(&TimerThing::updateStatus, this, 
                      boost::asio::placeholders::error));
    }
    

    您也需要使用占位符。

    一般提示:最好发布可编译的示例而不是完整的编译器。在您的情况下,删除不可移植的 VC 垃圾(tmainstdafx)并添加所有包含。

    【讨论】:

    • 不幸的是,我仍然遇到同样的错误。在解决问题时,我实际上已经将该行注释掉了。感谢您指出了这一点。解决原始问题后,它至少可以为我节省一些故障排除时间。我将删除 VC 垃圾并添加包含并修复我的遗漏。
    • @ThomasLann gist.github.com/4108222 这个 sn-p 为我编译干净。错误必须在您未向我们显示的代码的一部分中。
    • 其实只有这样的代码。我相信问题是我正在使用其他人构建的库。感谢您的帮助。
    • 我刚刚下载了 boost 1.48 的新副本。我的印象是 asio 不需要链接到库,即使它是依赖项。这是真的?我正在使用 VS2010 我只是尝试用它来编译它,但我仍然遇到同样的问题。这听起来像一个编译器设置。你能具体说明你用的是什么吗?
    • 在 VS Boost 上使用了一些自动链接魔法。对不起,我帮不了你。我在这里所做的就是把东西扔到一个文件中,然后唱出正确的 gcc 咒语,包括链接器调用。如果您确定这是链接器问题,请发布一个新问题并关闭此问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多