博客
关于我
C++11中bind的使用错误
阅读量:303 次
发布时间: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/

你可能感兴趣的文章
Java设计模式 —— 桥接模式(Bridge)
查看>>
计算机三级 信息安全技术历年真题(二)总共十套 3月底之前更完
查看>>
详解: 最小生成树
查看>>
[编程题]:n头牛中选择满足所有m种特性的牛(百度2021)
查看>>
Redis中的删除策略和逐出算法
查看>>
[数据结构]:红黑树(二)
查看>>
PyCharm安装与配置
查看>>
Docker - 部署 Redis 6.0.8
查看>>
Android - Create dynamic lists with RecyclerView
查看>>
Android - Broadcasts overview(不完整)
查看>>
Spring Boot - Add a Servlet to an Application
查看>>
OrCAD Capture CIS 16.6 - 为元器件添加属性
查看>>
Web API - File - Selecting files using drag and drop
查看>>
Spring Boot - axios upload file(带请求头上传文件,非前后端分离)
查看>>
排序算法总结——c++实现
查看>>
vector的几种初始化及赋值方式
查看>>
STL基础梳理 2019.1.19(仿函数,谓词,内建函数对象,适配器,算法)
查看>>
IDEA效率快捷键收集
查看>>
并发情况下三种线程/并发安全
查看>>
希尔排序
查看>>