我需要将方法作为参数发送(MS Visual Studio 2008):
void Apply(Node<string>* node, void (visit(TreeEditor* self, Node<string> *)))
但发生此错误:
错误C2664:'TreeEditor :: Apply':无法将参数2从'void(__ thishisall TreeEditor :: *)(TreeEditor *,Node *)'转换为'void(__ cdecl *)(TreeEditor *,Node *)' d:\ ed7 \ saod \ labs \ oopkkrtree \ treeeditor \ treeeditor.h 74
我尝试使用这种类型:
void Apply(Node<string>* node, void(__thiscall TreeEditor::*)(TreeEditor *,Node<string> *))
现在它可以工作,但我不知道如何指定参数的名称(例如:void(func(int)))
我无法发送静态方法。
我试着这样做:
void Apply(Node<string>* node, void(visit)(__thiscall TreeEditor::*)(TreeEditor *,Node<string> *))
void Apply(Node<string>* node, void(visit(__thiscall TreeEditor::*)(TreeEditor *,Node<string> *)))
void Apply(Node<string>* node, void(__thiscall TreeEditor::*)(visit(TreeEditor *,Node<string> *)))
但它不起作用。 请帮帮我。
答案 0 :(得分:2)
该名称位于*
:
void Apply(Node<string>* node, void(TreeEditor::*visit)(TreeEditor *,Node<string> *))
__thiscall
是不必要的,只适用于Visual C ++(IIRC)。此外,您还需要传递或以其他方式使用TreeEditor
来调用方法。
我还建议为该回调类型提供typedef
:
typedef void(TreeEditor::*TreeEditorVisitor)(TreeEditor*, Node<string>*);
然后你可以像这样写Apply
:
void Apply(Node<string>* node, TreeEditorVisitor visit)
答案 1 :(得分:1)
默认情况下,__ thishisall表示函数是类成员函数,__ cdecl是非成员函数。因此,您的错误消息是抱怨您的函数声明请求了非成员函数指针,但是您正在传递成员函数指针。
因此,您可以更改Apply
的声明void Apply(Node<string>* node, void (TreeEditor::*visit)(TreeEditor* self, Node<string> *))
或者有一个包装函数调用你的对象的方法,然后传递该函数。