S'il vous plaît se référer le code ci-dessous:incapable de passer la fonction de modèle comme paramètre de rappel
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();
}
J'utilise le compilateur VC6 et le compilateur plaids l'erreur suivante:
error C2664: 'schedule' : cannot convert parameter 2 from 'void (int,void *)' to 'void (__cdecl *)(int,void *)' None of the functions with this name in scope match the target type E:\test\BTest\BTest.cpp(46) : while compiling class-template member function 'void __thiscall MyLogic::testMe(void)'
Je l'ai testé ce code dans Visual Studio 2008 et ça marche bien sans aucun problème.
Je sais que VC6 est un compilateur obsolète mais mon code source du projet (hérité) est toujours compilé avec VC6.
Par conséquent, tout travail autour de possible de compiler ce code?
Avec l'étiquette "6" vous voulez dire VC6? – codymanix
oui. Je changerai. –
avec '& myTimerFunc', cela fonctionne-t-il? –
Scharron