请参阅以下代码:
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编译的。
因此,是否有可能使这段代码编译?
答案 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
,反之亦然。