无法将Template函数作为回调参数传递

时间:2010-08-04 12:59:01

标签: c++ templates callback vc6

请参阅以下代码:

typedef void (*TimerCallback)(int RequestID_in, void* AdditionalParameter_in);
class  MyTimer
{
    public:
        MyTimer(){}
        bool schedule( int Interval_in, TimerCallback TimerCallback_in, void* AdditionalParameter_in)
        {
            //some logic
            return true;
        }
};

namespace
{
    template <class T>
    void myTimerFunc(int RequestID_in, void* AdditionalParameter_in)
    {
        MyLogic<T>* pLogic = static_cast<MyLogic<T>*>(AdditionalParameter_in);
        if(pLogic)
        {
            //do something
        }
    }
}

template <class T>
class MyLogic
{
public:
    MyLogic(){}

    void testMe()
    {
        MyTimer aTimer;
        aTimer.schedule(10, myTimerFunc<T>, this);
    }
};

int main()
{
    MyLogic<int> myLogic;
    myLogic.testMe();
}

我正在使用VC6编译器,编译器抛出以下错误:

  

错误C2664:'schedule':不能   从'void转换参数2   (int,void *)'to'void(__ cdecl   *)(int,void *)'           范围内具有此名称的函数都不匹配目标   类型           E:\ test \ BTest \ BTest.cpp(46):编译class-template成员时   function'void __thiscall   MyLogic :: TESTME(无效)'

我在Visual Studio 2008中测试了这段代码,它运行正常,没有任何问题。

我知道VC6是一个过时的编译器,但我的项目源代码(旧版)仍然是用VC6编译的。

因此,是否有可能使这段代码编译?

2 个答案:

答案 0 :(得分:1)

我遇到的Visual Studio的所有版本在必须解析/转换模板函数到函数指针时会发生癫痫发作。我使用的解决方法是使用id()函数返回其参数不变

template<class T>
T id(T t) 
{
    return t;
}

template <class T>
class MyLogic
{
public:
    MyLogic(){}

    void testMe()
    {
        MyTimer aTimer;
        aTimer.schedule(10, id(myTimerFunc<T>), this);
        //------------------^^(              )
    }
};

这在Visual Studio 6下编译。请注意,myTimerFunc的类型在这里没有改变,它只是帮助编译器解决问题。

答案 1 :(得分:0)

我相信你错过了__stdcall

typedef void (__stdcall *TimerCallback)(int RequestID_in, void* AdditionalParameter_in);

我不知道为什么,但这就是错误信息所暗示的内容。也许你有一个编译器参数,告诉它假设__stdcall而不是__cdecl,反之亦然。