C++11中bind的使用错误

236 篇文章 94 订阅
10 篇文章 0 订阅


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

#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调用了两次的原因,编译器不骗人啊。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值