2014-03-13 57 views
0

我已經聲明瞭一個包含另一個類AVLNode的類AVL。 AVL類包含一個插入函數。我想插入返回一個AVLNode指針。我在這段代碼中遇到了編譯錯誤。什麼是錯誤?根據模板參數返回值

template<class KeyType> 
class AVL 
{ 
    public: 
     template<class KeyType> 
     class AVLNode{}; 

     AVLNode<KeyType>* insert(const KeyType& key); 
} 

template<class KeyType> 
AVLNode<KeyType>* AVL<KeyType>::insert(const KeyType& key) 
{ 
    if (m_root == 0) 
    { 
     m_root = new AVLNode<KeyType>(key); 
     return m_root; 
    } 
    else 
     return insert_Helper(key,m_root); 
} 
+0

什麼是編譯錯誤? – hrkz

回答

2

AVLNode類模板是內AVL嵌套類模板。要訪問它,請使用AVL<KeyType>::AVLNode<KeyType>。 (?我不知道爲什麼你做AVLNode類模板,我懷疑這是必要的你真的想有AVL<int>::AVLNode<float>

或者,您可以使用尾隨返回類型:

template<typename KeyType> 
auto AVL<KeyType>::insert(const KeyType& key) -> AVLNode<KeyType>* 

這被允許,因爲您已經將其限定爲AVL<KeyType>的成員函數,因此您現在可以自由使用其中的名稱。

+2

不僅'AVLNode'可能不需要模板,而且它的模板參數使用相同的名稱'KeyType'作爲它的封閉類'AVL'的參數是一個錯誤:''KeyType'聲明的陰影模板參數「。 – iavr

0

@Anton_Golov說你只需要一個你的類的模板,因爲當你的節點可以是浮動的時候它沒有一個整數的樹。你只需要一個模板。爲了不與他們混淆,試着讓你的類更加緊湊,使整個函數保存在你的類中,我認爲這是對數據結構或某些開源應用程序的某種功課,所以不需要編寫功能在類之外,因爲你使用模板並且必須在類之外編寫很多東西。這裏是你的代碼沒有錯誤:

template<class KeyType> 
class AVL 
{ 
    public: 
    class AVLNode{}; 
    AVLNode m_root; 

    AVLNode* insert(const KeyType& key) 
    { 
     if (m_root == 0) 
     { 
      m_root = new AVLNode(key); 
      return m_root; 
     } 
     else 
      return insert_Helper(key,m_root); 
    } 
}; 

AVL<int> myTree;你有一個AVLINT節點