【发布时间】:2010-08-04 12:59:00
【问题描述】:
请参考以下代码:
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:“计划”:不能 从 'void 转换参数 2 (int,void *)' 到 'void (__cdecl *)(int,void *)' 范围内具有此名称的函数都不匹配目标 类型 E:\test\BTest\BTest.cpp(46) : 在编译类模板成员时 函数'无效__thiscall MyLogic::testMe(void)'
我在 Visual Studio 2008 中测试了这段代码,它运行良好,没有任何问题。
我知道 VC6 是一个过时的编译器,但我的项目源代码(旧版)仍然使用 VC6 编译。
因此,有什么办法可以使这段代码编译?
【问题讨论】:
-
与
&myTimerFunc<T>,它有效吗? -
@Scharron,没有。它没有帮助
-
aJ:你应该更新你的编译器。 VC6 因错误和标准支持差而臭名昭著。
-
@DeadMG 公平地说,此代码在当前 C++ 中是非法的。只有 C++0x 允许它,并且大多数编译器在其当前的 C++ 支持中向后移植了它。见open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#115
标签: c++ templates callback visual-c++-6