【发布时间】:2013-08-25 10:26:38
【问题描述】:
我有以下电话:
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... 修复了这些问题,但产生了一组新问题(即我无法访问非静态对象(非静态成员引用必须相对于特定对象)
我有一个类似的遍历操作,它适用于静态声明,因为被调用的函数只显示有关调用它的每个对象的信息。
我这几天一直在寻找答案,我觉得这很简单。有没有办法在另一个函数调用中使用非静态函数作为参数?
【问题讨论】:
-
没有看到实际代码使得理解这个问题有些问题(至少对我来说)。第一个 sn-p 甚至不是有效的 C++ 代码,因为第一行是 声明,第二行是实际的函数调用。 实际问题是什么?您是否试图将指向成员函数的指针传递给另一个用于枚举算法的函数? Zac 的链接问题很好地涵盖了这一点。
-
如果您确切知道要传递哪些函数,并且这些函数可以从您希望调用它们的上下文中访问,您可以通过枚举替换该函数,并在调用时进行切换地点。当然,这并不灵活。
-
我不确定 Zac 链接的问题是如何重复的,因为解决方案是“使用静态函数”,这是我试图避免的。 @WhozCraig 是的,第一行是 C++ 声明,表示函数声明为非静态的。第二行是函数调用。实际的问题是不能使用派生类函数 GetEntry 作为参数来执行函数调用 InorderTraverse(GetEntry)。我没有使用枚举算法;我正在遍历 BST 以从树中检索条目。我不确定要发布哪些其他代码来澄清。
-
不管怎样,遍历 BST 是一个枚举算法,如果有的话。无论如何,您希望传递的函数 is 还是 not 成员函数?静态很简单,但听起来您想传递派生的成员,如果是这样,它仍然可行,但涉及更多布线。
标签: c++ static-methods