2012-04-24 77 views
1

對於我的數據結構類,我們被要求採用先前實現的平衡樹(來自之前的項目),並使用它來實現C++標準地圖類的部分。嵌套類導致模板問題

http://cplusplus.com/reference/stl/map/

我想最明顯的第一步是模板整個類,允許單獨的密鑰和存儲類型。當然,我遇到了模板問題。通常我的模板工作,直到我試圖模板使用本地嵌套數據類型「rbNode」的函數。如果我在函數定義中包含模板參數,則會出現語法錯誤。如果我將它們排除在外,則會收到「不包含模板參數」錯誤。

這是類實現,它給我的錯誤,在Visual Studio 2010(在下面列出的錯誤):

#include <cstdlib> 
#include <iostream> 
template <class key_type, class T> 
class myMap 
{ 
private: 
    //typedef pair<const key_type, T> value_type; 
    struct rbNode 
    { 
     //value_type ref; 
     int element; 
     rbNode * left; 
     rbNode * right; 
     bool red; 
     rbNode(int key) 
     { 
      left = NULL; 
      right = NULL; 
      //ref.first = key; 
      //ref.second = element; 
      element = key; 
      red = true; 
     } 
    }; 
    rbNode * root; 
    bool search(int , rbNode *); 
    rbNode * LL_Rotation(rbNode *); 
}; 

template <class key_type, class T> 
myMap<key_type,T>::rbNode* myMap<key_type,T>::LL_Rotation(rbNode * curr) // errors occur on this line 
{ 
    rbNode * temp = curr->right; 
    curr->right = temp->left; 
    temp->left = curr; 

    curr->red = 1; 
    temp->red = 0; 

    return temp; 
} 

這個功能,但是,編譯就好了上述功能註釋:

template <class key_type,class T> 
bool myMap<key_type,T>::search(int key,rbNode * tree) 
{ 
    if(tree!=NULL) 
     if(tree->element==key) 
      return true; 
     else 
      if(key< tree->element) 
       return search(key,tree->left); 
      else 
       return search(key,tree->right); 
    else 
     return false; 
} 

特別是,我越來越

missing ';' before '*'missing type specifier - int assumed. Note: C++ does not support default-int 就行了「LLRotation」的名字的實現在(註釋中指出)。我對模板不太熟悉,所以我覺得我犯了一個非常愚蠢的錯誤。無論如何,如果您需要更多我的代碼或更多信息,請告訴我。任何幫助是極大的讚賞。

注意:我確定我的代碼有很多不良實踐等等。我還在學習。隨意指出,但我最關心的模板問題。

+0

這將是有益的,如果你能發佈微創編譯例子 – 2012-04-24 01:58:04

+0

對不起。我修改了帖子。第一塊應該是可編譯的。 – codepringle 2012-04-24 03:14:24

回答

0

你只是缺少一個typename爲從屬名稱:

template <class key_type, class T> 
typename myMap<key_type,T>::rbNode* myMap<key_type,T>::LL_Rotation(rbNode * curr) 
^^^^^^^^ 
+0

就是這樣!非常感謝你。 – codepringle 2012-04-24 04:10:52

+0

@codepringle不客氣 – justin 2012-04-24 04:30:34