2010-06-01 51 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