2011-12-07 75 views
2

我得到的錯誤,當我嘗試編譯一個簡單的AVL樹方案:指針和引用錯誤在C++

no matching function for call to A::max(A*&, A*&) 
candidates are: int A::max(A&, A&) 
request for member 'levels' in 'b', wich is of non-class type 'A*' 

下面是導致這些問題的方法:

void A::simpleLeftRotation(A & tree){ 
    A* b = tree.leftNode; 
    tree.leftNode = b->RightNode; 
    b->rightNode = &tree; 
    tree.levels = 1 + max(tree.leftNode, tree.rightNode); // Problem 1 
    b.levels = 1 + max(b.rightNode, tree); // Problem 2 
    tree = b;  
} 

這裏是我班成員:

A* righNode; 
A* leftNode; 
int levels; 
int element; 

在行:

b.levels = 1 + max(b.rightNode, tree); 

如果我用 - > insted的點操作,我得到:

no matching function for call to A::max(A*&, A&) 
candidates are: int A::max(A&, A&) 

我不知道我做錯了。
謝謝。

+0

謝謝大家。 Mysticial的答案是最完整的一個 –

回答

1

你雖然沒有向我們展示所有類型的聲明,我懷疑這將解決該問題:

tree.levels = 1 + max(*(tree.leftNode), *(tree.rightNode)); 
b.levels = 1 + max(*(b.rightNode), tree); 

本來,你傳遞指針在當max函數需要引用。因此,類型不匹配會導致錯誤。所以你需要如圖所示取消引用你的指針。

+0

這就是我正在瞄準的完整答案。謝謝 –

1

你應該叫max爲:

max(*(tree.leftNode), *(tree.rightNode)); 

max(*(b.rightNode), tree); 

由於leftNoderightNode類型是A*tree的類型是A,所以沒問題。

我建議你將max的參數類型從A&更改爲A*,因爲它會使代碼更清晰一些。

1

您需要取消引用您的指針:

tree.levels = 1 + max(tree.leftNode, tree.rightNode); 

您正在嘗試指針傳遞給需要作爲參數引用的方法。做:

tree.levels = 1 + max(*(tree.leftNode), *(tree.rightNode));