博客
关于我
C++11中bind的使用错误
阅读量:304 次
发布时间:2019-03-04

本文共 2002 字,大约阅读时间需要 6 分钟。

写了一个非常简单的应用,如下:

#include <functional>

typedef struct__Data

{

         intd;

}DataCB;

 

template <typenameT>

class ICallBack

{

public:

         ICallBack(){}

         ~ICallBack(){}

public:

        

          voidDoCallBack(T *data)

         {

                    printf("-------------------------------");

         }

public:

         /*boolisUse_ = true;*/

};

template <typenameTT>

class CallBackControl

{

public:

         usingDoControl = std::function<void(TT*)>;

public:

         CallBackControl(){}

         ~CallBackControl(){}

public:

         //实际使用给一个LAMBDA表达式就可以了。

         //voidControlBind(DoControl dc)

         //{

         //       this->doCallBack_ = dc;

         //}

         voidContorlBind(ICallBack<TT> *icb)

         {

                   this->doCallBack_= std::bind(&ICallBack<DataCB>::DoCallBack,icb,std::placeholders::_1);

         }

         voidoperator()(TT*t)

         {

                   if(nullptr!=this->doCallBack_)

                   {

                            this->doCallBack_(t);

                   }

 

         }

         intGetData(intd){

                   returnd;

         }

private:

         DoControl doCallBack_ =nullptr;

};

class StdThread 

{

public:

         StdThread(){}

         virtual~StdThread(){}

public:

         voidInitStdThread(ICallBack<DataCB>*icb){

                   this->cb_.ContorlBind(icb);

                   //this->cb_.GetData(10);

                   this->cb_(&db_);

         }

 

private:

         voidRun();

private:

                      //线程运行条件变量

         CallBackControl<DataCB>cb_;

         DataCB db_;

};

 

int _tmain(intargc,_TCHAR*argv[])

{

         ICallBack<DataCB> *icb =new ICallBack<DataCB>;

         StdThread std;

         std.InitStdThread(icb);

         system("pause");

         return0;

}

结果编译总是过不去,总是说参数不对"error C2064: 项不会计算为接受 1 个参数的函数",不能够使用一个参数。错误基本定位到fucntion的应用这里。也是无语了,把一些具体的模板都写成实例,还是报同样的错误。

1>          d:\vs2013_project\binduse\binduse\binduse.cpp(65): 参见对正在编译的函数 模板 实例化“std::function<void (TT *)>::function<ICallBack<DataCB>*&>(_Fx)”的引用

1>          with
1>          [
1>              TT=DataCB
1>  ,            _Fx=ICallBack<DataCB> *&
1>          ]
1>          d:\vs2013_project\binduse\binduse\binduse.cpp(65): 参见对正在编译的函数 模板 实例化“std::function<void (TT *)>::function<ICallBack<DataCB>*&>(_Fx)”的引用
1>          with
1>          [
1>              TT=DataCB
1>  ,            _Fx=ICallBack<DataCB> *&
1>          ]

实在没办法了,把ICallBack这个类改成了非模板类,将回调函数改成了模板函数,报模板函数不能是虚拟的,去除,结果还是报同样的错误。参数不对,参数不对,一点办法都没有了。

因为是模板类,所以报得错误稀里哗啦的也看不出到底什么原因,直到把第一个注释掉,才发现,程序报没有ControlBind这个函数,这才猛得明白,肯定犯了超低级的错误。重载函数的名字写错了,但是一直使用前面的那个函数名,所以才是模板不断的实例化,这才明白当初编译器报得那个错误里function调用了两次的原因,编译器不骗人啊。

看上面变红的两个函数,无语到底。自己挖坑自己添,怪不得别人啊。

转载地址:http://xsxq.baihongyu.com/

你可能感兴趣的文章
vue指令之v-for
查看>>
[CF1278F]Cards
查看>>
用postman测试url参数
查看>>
Vue的is属性
查看>>
vue组件传参 props default 数组/对象的默认值应当由一个工厂函数返回
查看>>
vue爬坑之 父组件向子组件异步传参 子组件中拿不到值的解决方法
查看>>
js基础复习5-原型链与js的成员查找机制
查看>>
js基础复习8-call方法简单使用以及javascript继承
查看>>
【游记】被吊打DAY2
查看>>
微信公众号开发之素材管理
查看>>
mysql limit 1 (报错信息:Subquery returns more than 1 row)
查看>>
修改dynamic web module的版本大小
查看>>
Node.js response 页面中文乱码
查看>>
gitee 修改个人域名 个人空间地址 URL
查看>>
C++11中bind的使用错误
查看>>
futex同步机制分析之三内核实现
查看>>
多线程的伪共享
查看>>
flink分析使用之五工作图的生成和分发
查看>>
基于OpenCV的路面质量检测
查看>>
Spring Cloud系列_11 Feign负载均衡、请求传参
查看>>