为啥我都编译不过去。总是卡在pthis->*pfuc上,说->*这个符号有问题。 下面是原本的代码,我把明显有错误的,callback(改为callback{。把p1->base改成了p1->pThis。
网上很多地方都引用了这段代码。怎么我就编译不过去?
 class base; 
     
    typedef int (base::*fnCallBack)(void *p); 
    struct callback(void *param;fnCallBack *pfuc;base *pThis;}; 
     
    class base{ 
     static int myThreadfuc(void *p){ 
     struct callback *p1=(struct callback *)p; 
    base *pthis=p1->base;fnCallBack *pfuc=p1->pfuc;void *param=p1->param; 
    int i=(pthis->*pfuc)(param);delete p; 
    return i; 
     
    } 
    public: 
     void myCreateThread(fnCallBack pfuc,void *param){ 
     struct callback *p=new struct callback; 
     p.param=param;p.pThis=this;p.pfuc=pfuc; 
     ::CreateThread(myThreadfuc,p); 
     
    } 
     virtual int myCallBack(void *p){printf("It's base class.\n");return 0;} 
    }; 
    class derived:public base{ 
     int myCallBack(void *p){printf("It's derived class\n");} 
    }; 
    void myCreateThreadImitate(fnCallBack fuc,void *p) 
    { 
     (*fuc)(p); 
    } 
    void main() 
    { 
     base p;char *param; 
     p.myCreateThread(&(base::myCallBack),param); 
     derived p2;p2.myCreateThread(&(base::myCallBack),param); 
     
    } 

解决方案 »

  1.   

    不行啊。去掉*error问题更多。我怀疑贴代码的那个哥们就是随手那么一写的,然后,网络四处抄袭
      

  2.   

    错误提示是 error C2297: '->*' : illegal, right operand has type 'int (__thiscall base::** )(void *)'
      

  3.   

    干脆就不管他的代码,我一般这样:
    在类里添加一个static DWORD WINAPI MyThreadPoc(LPVOID lpData)方法,然后你创建线程时直接使用这个方法作为执行函数就好了
      

  4.   

    少传一个参数 成员函数void myCreateThread(fnCallBack pfuc,void *param)的原型应该是
    void myCreateThread(const Base* const this,fnCallBack pfuc,void *param)derived p2;p2.myCreateThread(boost::bind(&(base::myCallBack),p,param));
    差不多就可以了~~ 
      

  5.   

    可以把你的类对象指针(this)传递到回调函数中,在做个类型转换,就可以了。
    依据我的知识水平,作为回调函数只能有两种,一种是全局函数(类似于C里面的函数),还有就是类的静态成员函数(因为非静态函数中有个this指针问题,所以不行)
      

  6.   

    :CreateThread参数个数不对static int myThreadfuc(void *p)
    改成
    static DWORD callback myThreadfuc(LPVOID p)