2010-06-01 50 views
0

我正在使用操作二叉查找树的库。在这个库是遍历树,并将它找到一个回调类中的每个节点的功能:将听众类传递给函数的问题

bool TCODBsp::traverseInvertedLevelOrder(ITCODBspCallback *callback, void *userData)

ITCODBspCallback是在库中的基类,用户应该获得自己的回调类传递给函数。这是基础类:

class ITCODBspCallback { 
public : 
    virtual bool visitNode(TCODBsp *node, void *userData) = 0; 
}; 

这里是我的派生类:

class MyCallback: public ITCODBspCallback 
{ 
    public: 
     virtual bool visitNode(TCODBsp*, void*); // defined in my implementation file 
}; 

我再传给MyCallback像这样的功能:

bsp->traverseInvertedLevelOrder(new MyCallback(), NULL);

和g ++给了我以下错误:

expected type-specifier before 'MyCallback'
expected ')' before 'MyCallback'
no matching function for call to 'TCODBsp::traverseInvertedLevelOrder(int*, NULL)'
note: candidates are: bool TCODBsp::traverseInvertedLevelOrder(ITCODBspCallback*, void*)

任何人都知道什么是错的?我很好奇为什么它认为MyCallbackint*,特别是。

+0

上面显示了您的整个派生类吗?或者你可能在那里定义了任何转换运算符? – 2010-06-01 21:11:51

+0

这是我的整个派生类,是的。 – Max 2010-06-01 21:17:08

回答

2

这一切看起来像你忘了包括MyCallback标题。由于它的解析器不解释MyCallback作为一种类型,如果它不知道它是一个,它会出现一个自己的类型,并且忽略MyCallback(),我想。它提供的类型是int*

请注意,您的代码泄漏是因为您需要在任何new'ed对象上调用delete。创建这样的对象没有任何问题:

MyCallback b; 
bsp->traverseInvertedLevelOrder(&b, NULL); 

在这种情况下,您是免费的内存管理。

+0

我的实现文件包含头文件。尽管'MyCallback'和调用'traverseInvertedLevelOrder'的实现文件中的函数都是同一类的私有成员。这与它有什么关系? – Max 2010-06-01 21:14:22

+0

@Max我认为你应该提供更多的代码。类似于'struct A {void f(){new B; } struct B {}; };'很好。所以你的bug在其他地方。 – 2010-06-01 21:17:09

+0

将函数调用更改为您的建议,并将MyCallback从类中移出,解决了问题。不完全确定原因,但这可能只是我的一个简单的错误。谢谢你的帮助。 – Max 2010-06-01 21:22:37