невозможно передать функцию шаблона в качестве параметра обратного вызова - PullRequest
3 голосов
/ 04 августа 2010

Пожалуйста, используйте код ниже:

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: «расписание»: невозможно преобразовать параметр 2 из 'void (int, void *) 'to' void (__cdecl *) (int, void *) ' Ни одна из функций с этим именем в области не соответствует цели тип E: \ test \ BTest \ BTest.cpp (46): при компиляции члена шаблона класса функция 'void __thiscall MyLogic :: TestMe (аннулируются) '

Я тестировал этот код в Visual Studio 2008, и он работает без проблем.

Я знаю, что VC6 является устаревшим компилятором, но исходный код моего проекта (устаревший) все еще скомпилирован с VC6.

Следовательно, можно ли обойти этот компилятор?

Ответы [ 2 ]

1 голос
/ 04 августа 2010

Все версии 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 здесь не меняется, он просто помогает компилятору разрешать проблемы.

0 голосов
/ 04 августа 2010

Я полагаю, что вам не хватает __stdcall там:

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

Я не уверен, почему, но это то, что предлагает сообщение об ошибке.Возможно, у вас есть параметр компилятора, который говорит, что он должен принимать __stdcall вместо __cdecl или наоборот.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...