c ++ - 函数指针对象似乎不存在

时间:2013-07-03 15:58:52

标签: c++ function-pointers undefined-symbol

我正在写一些组织和跟踪某些任务的图书馆。每当调用一个nwe任务时,我的libary都会使用构造函数中给出的函数指针。但是当我尝试调用它时,我收到错误Symbol not found

在Header文件中,我将其声明为:

template <class T>
class TaskManager
{
private:
    // other variables
    T TaskID;  // This is defined like this (just to clear things up)
    void (*TaskHandler)(T, TaskManager<T>*);
    // some more stuff
};

我称之为

template <class T>
void TaskManager<T>::startActualTask()
{
    (*TaskManager<T>::TaskHander)(TaskID, this);    // Errors!
}

template <class T>
void TaskManager<T>::startActualTask()
{
    TaskManager<T>::TaskHander(TaskID, this);       // Errors!
}

(删除'TaskHander(TaskID,this)前面的TaskManager<T>::;'没有帮助。)

但它无法找到符号TaskHandler。无论我到目前为止尝试过什么!

完整错误是:

e:\eigene dateien\visual studio 2010\projects\brainstonemod - publish\brainstonemod - publish\TaskManager.cpp(212): error C2039: 'TaskHander': Is no element of 'TaskManager<T>'
          with
          [
              T=int
          ]
          e:\eigene dateien\visual studio 2010\projects\brainstonemod - publish\brainstonemod - publish\TaskManager.cpp(211): At the compiling of the class template of the void TaskManager<T>::startActualTask(void) member function
          with
          [
              T=int
          ]
          e:\eigene dateien\visual studio 2010\projects\brainstonemod - publish\brainstonemod - publish\TaskManager.cpp(73): At the compiling of the class template of the void TaskManager<T>::addTask(Task<T>) member function
          with
          [
              T=int
          ]
          e:\eigene dateien\visual studio 2010\projects\brainstonemod - publish\brainstonemod - publish\TaskManager.cpp(9): At the compiling of the class template of the TaskManager<T>::TaskManager(std::wstring,std::wstring,void (__cdecl *)(T,TaskManager<T> *)) member function
          with
          [
              T=int
          ]
          main.cpp(14): See the Instatiation of the just compiled class template "TaskManager<T>".
          with
          [
              T=int
          ]

(我不得不翻译这个。所以它可能不会被翻译!)

这也可能很有趣:

template <class T>
TaskManager<T>::TaskManager(wstring title, wstring subtitle, void (*taskHandler)(T, TaskManager<T>*)) :
    // Some intatiations
{
    TaskHandler = taskHandler;
    // More contructor stuff
}

我怎么能解决这个问题?

2 个答案:

答案 0 :(得分:0)

如果它是一个普通的成员,它是一个函数指针(它在你的类声明中似乎是这样),你应该这样称呼它:

template <class T>
void TaskManager<T>::startActualTask()
{
    TaskHandler(TaskID, this);
}

您只对静态成员或typedef使用TaskManager<T>::前缀。

答案 1 :(得分:0)

这是一个错字。我拼写了TaskHander,但它是TaskHandler(我忘记了l

谢谢你!