0

我有以下电话:

void Derived::GetEntry(Skill&);
InorderTraverse(GetEntry);

哪个电话

void Base<ItemType>::InorderTraverse(void Visit(ItemType&)) const

尝试编译为书面生成

错误 C3867:“Derived::GetEntry”:函数调用缺少参数列表;使用 '&Derived::GetEntry' 创建指向成员的指针

使用 &Derived::GetEntry 生成

无法将参数 1 从 'void (__thiscall Derived::* )(Skill &)' 转换为 'void (__cdecl *)(ItemType &)'

将声明更改为 static void GetEntry... 解决了这些问题,但产生了一组新问题(即我无法访问非静态对象(非静态成员引用必须相对于特定对象)

我有一个类似的遍历操作,它适用于静态声明,因为被调用的函数只显示有关调用它的每个对象的信息。

我一直在寻找几天的答案,我觉得这很简单。有没有办法在另一个函数调用中使用非静态函数作为参数?

完整代码为:https ://github.com/mindaika/SkillTree

4

2 回答 2

3

编辑:改为插入完整的工作示例。

我建议您改用 std 函数指针。

例如:

#include <functional>
void main()
{
class TheClass
{
public:

   TheClass()
   {
       m_function = ( std::tr1::bind(&TheClass::run, this) );
   };

   void run()
   {
          // stuff to do
   };

   std::tr1::function<void ()> m_function;
};

TheClass theclass;
theclass.m_function();

}

m_function(); //调用函数

于 2013-08-22T15:30:25.507 回答
0

正如我在我的问题中提到的,我试图解决由使用静态变量引起的“内存泄漏”(它实际上不是泄漏,因为静态被破坏,但直到泄漏检测器运行之后)。我最终使用了这里描述的封装指针的修改:C++ freeing static variables

于 2013-08-23T21:26:05.670 回答