Статическая ошибка компиляции C ++ при использовании шаблонов - PullRequest
0 голосов
/ 04 августа 2011

у меня

template < typename threadFuncParamT >
class ThreadWrapper
{
public:
    static int ThreadRoutineFunction(void* pParam);
    int ExecuteThread();

    ThreadWrapper(ThreadPool<threadFuncParamT> *pPool);

};

template<typename threadFuncParamT>
int ThreadWrapper<threadFuncParamT>::ThreadRoutineFunction(void* pParam)
{
    ThreadWrapper<threadFuncParamT> *pWrapper = reinterpret_cast<ThreadWrapper<threadFuncParamT>*>(pParam);
        if(pWrapper != NULL)
{

        return pWrapper-ExecuteThread(); // Error here.
    }

    return 0;
}

template < typename threadFuncParamT >
ThreadWrapper<threadFuncParamT>::ThreadWrapper(ThreadPool<threadFuncParamT> *pPool)
{
    ThreadWrapper<threadFuncParamT>::m_pThreadPool = pPool;
    m_tbbThread = new tbb::tbb_thread(&(ThreadWrapper<threadFuncParamT>::ThreadRoutineFunction), this);
    if (m_tbbThread->native_handle() == 0)
    {
        delete m_tbbThread;
        m_tbbThread = NULL;
        // TODO: throw execption here or raise assert.
    }
}

Я получаю ошибку, как показано ниже Ошибка 1 ошибка C2352: «ThreadWrapper :: ExecuteThread»: недопустимый вызов нестатической функции-члена

Я компилирую на VS2010.

Может ли кто-нибудь помочь мне здесь, как устранить ошибку.

Спасибо!

Ответы [ 4 ]

3 голосов
/ 04 августа 2011

Проблема в том, что ваша строка ошибки

return pWrapper-ExecuteThread(); // Error here.

пропускает >; должно читаться

return pWrapper->ExecuteThread(); // Error here.

Вы получаете такую ​​странную ошибку компиляции, поскольку она пытается выполнить вычитание; указатель pWrapper рассматривается как целое число, и из него вычитается значение, возвращаемое при вызове ExecuteThread() (что дает int). Однако ExecuteThread() не является ни глобальной функцией, ни статической функцией-членом - поэтому компилятор жалуется.

2 голосов
/ 04 августа 2011

Вы пропускаете> по вызову. Вы хотите return pWrapper->ExecuteThread();

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

Вы не можете вызывать статическую функцию-член с этим синтаксисом. Попробуйте вместо этого сделать следующее:

static_cast<ThreadWrapper*>(pParam)->ExecuteThread();

Может быть излишним, но объяснение: функции, которые являются точками входа для потоков, не могут быть методами экземпляра, они должны быть функцией области файла или статическими методами. Обычной идиомой является передача пустого указателя в подпрограмму запуска статического / глобального потока, приведение этого указателя к соответствующему типу класса и использование его для вызова фактического метода экземпляра, который будет выполнен в другом потоке.

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

Вам не хватает ">" Это

pWrapper->ExecuteThread()

не

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