Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost::bind的用法。。。我做错了什么_C++_Boost_Timer_Compiler Errors_Boost Bind - Fatal编程技术网

C++ boost::bind的用法。。。我做错了什么

C++ boost::bind的用法。。。我做错了什么,c++,boost,timer,compiler-errors,boost-bind,C++,Boost,Timer,Compiler Errors,Boost Bind,我已根据以下问题的第一个答案改编了代码,用于制作周期计时器: 我删除了“count”变量,因为我要重复执行的方法不接受任何参数进行计算 编译器失败,出现以下错误: Error C2825 'F': must be a class or namespace when followed by '::' C:\.conan\wkypad\1\include\boost\bind\bind.hpp 75 Error C2510 'F': left of '::' must be

我已根据以下问题的第一个答案改编了代码,用于制作周期计时器:

我删除了“count”变量,因为我要重复执行的方法不接受任何参数进行计算

编译器失败,出现以下错误:

Error   C2825   'F': must be a class or namespace when followed by '::' C:\.conan\wkypad\1\include\boost\bind\bind.hpp  75  
Error   C2510   'F': left of '::' must be a class/struct/union  C:\.conan\wkypad\1\include\boost\bind\bind.hpp  75  
Error   C3646   'type': unknown override specifier  C:\.conan\wkypad\1\include\boost\bind\bind.hpp  75  
Error   C4430   missing type specifier - int assumed. Note: C++ does not support default-int C:\.conan\wkypad\1\include\boost\bind\bind.hpp 75  
Error   C2039   'type': is not a member of 'boost::_bi::result_traits<R,F>' C:\.conan\wkypad\1\include\boost\bind\bind.hpp  1284    
错误C2825“F”:后跟“:”C:\.conan\wkypad\1\include\boost\bind\bind.hpp 75时必须是类或命名空间
错误C2510“F”:“:”的左边必须是类/结构/联合C:\.conan\wkypad\1\include\boost\bind\bind.hpp 75
错误C3646“类型”:未知重写说明符C:\.conan\wkypad\1\include\boost\bind\bind.hpp 75
错误C4430缺少类型说明符-假定为int。注意:C++不支持默认int c:\.柯南\WkPad 1 \包含\Boosi\BIND\BIND.HPP 75
错误C2039“类型”:不是“boost::\u bi::result\u traits”C:\.conan\wkypad\1\include\boost\bind\bind.hpp 1284”的成员
我做错了什么? 我猜我使用boost::bind是错误的,但我无法找出确切的原因

这是我代码的相关部分

class ProjectBrowserComponent ...

private:
    void fetchData(const boost::system::error_code& /*e*/,
        boost::asio::deadline_timer* t);
    std::vector<Project> projects;
    ProjectsController pc;
    std::future<std::vector<Project>> projectsFuture;
    int interval_secs = 1;

...

template<typename R>
bool isReady(std::future<R> const& f)
{
    Logger::writeToLog("check future");
    return f.wait_for(std::chrono::seconds(-1)) == std::future_status::ready;
}

void ProjectBrowserComponent::initData() {
    Logger::writeToLog("requesting projects");
    projectsFuture = std::async(std::launch::async, &ProjectsController::getProjects, &pc);
    Logger::writeToLog("requested projects");
    boost::asio::io_service io_service;
    boost::asio::deadline_timer timer(io_service, boost::posix_time::seconds(interval_secs));
    timer.async_wait(boost::bind(&ProjectBrowserComponent::fetchData, boost::asio::placeholders::error, &timer));
    io_service.run();
}

void ProjectBrowserComponent::fetchData(const boost::system::error_code& /*e*/,
    boost::asio::deadline_timer* timer) {
    if (isReady(projectsFuture)) {
        projects = projectsFuture.get();
        std::cout << "got projs";
    }
    else {
        timer->expires_at(timer->expires_at() + boost::posix_time::seconds(interval_secs));
        // Posts the event
        timer->async_wait(boost::bind(&ProjectBrowserComponent::fetchData, boost::asio::placeholders::error, timer));
    }
}
class ProjectBrowserComponent。。。
私人:
void fetchData(const boost::system::error\u code&/*e*/,,
boost::asio::deadline_timer*t);
std::矢量项目;
项目控制器pc;
标准:未来项目未来;
整数间隔_秒=1;
...
模板
bool isReady(标准:未来const&f)
{
记录器::writeToLog(“检查未来”);
返回f.wait_for(std::chrono::seconds(-1))==std::future_status::ready;
}
void ProjectBrowserComponent::initData(){
记录器::writeToLog(“请求项目”);
projectsFuture=std::async(std::launch::async,&ProjectsController::getProjects,&pc);
记录器::writeToLog(“请求的项目”);
boost::asio::io_服务io_服务;
boost::asio::截止时间计时器(io_服务,boost::posix_时间::秒(间隔秒));
异步等待(boost::bind(&ProjectBrowserComponent::fetchData,boost::asio::placeholders::error,&timer));
io_service.run();
}
void ProjectBrowserComponent::fetchData(const boost::system::error\u code&/*e*/,,
boost::asio::截止时间(计时器*计时器){
如果(已准备好(项目未来)){
projects=projectsFuture.get();
std::cout expires_at(计时器->expires_at()+boost::posix_time::seconds(间隔秒));
//发布事件
timer->async_wait(boost::bind(&ProjectBrowserComponent::fetchData,boost::asio::placeholders::error,timer));
}
}
这个怎么样:

timer.async_wait(boost::bind(&ProjectBrowserComponent::fetchData, this, boost::asio::placeholders::error, &timer));
如果绑定成员函数,则还必须将它们绑定到类对象的正确实例。这里我将它绑定到
这个
,从代码的外观来看,我假设这就是您正在做的事情

sehe在评论中的注释:


需要注意的是,这必须在异步操作的整个过程中保持有效。实现这一点的常用方法是使
ProjectBrowserComponent
继承
从\u this
启用\u shared\u并从\u this()绑定到
shared\u。

需要注意的是,
必须在整个异步操作期间保持有效。实现这一点的一种常用方法是使
ProjectBrowserComponent
继承此
启用\u共享\u并从\u this()绑定到
shared\u