本文共 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/