c ++中的方法类型

时间:2011-12-02 21:29:10

标签: c++ visual-studio-2008

我需要将方法作为参数发送(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> *)))

但它不起作用。 请帮帮我。

2 个答案:

答案 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> *))

或者有一个包装函数调用你的对象的方法,然后传递该函数。