2012-04-24 90 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