Search code examples
classtemplatesdictionarynestedred-black-tree

Nested Class Causing Problems with Templating


For my Data Structures class we've been asked to take a previously implemented balanced tree(from a prior project) and use it to implement parts of the C++ standard map class.

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

I figured the most obvious first step was to template the entire class, allowing for separate key and storage types. Of course, I ran into problems with templating. Generally my templating works until I attempt to template a function that is using a local nested datatype "rbNode". If I include template parameters in the function definition, I get syntax errors. If I leave them out, I get "template parameters not included" errors.

This is the class implementation that gives me the errors in Visual Studio 2010 (errors listed below):

#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;
}

This function, however, compiles just fine with the above function commented out:

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;
}

In particular, I'm getting

missing ';' before '*' and missing type specifier - int assumed. Note: C++ does not support default-int on the line the implementation for "LLRotation"'s name is in (pointed out in comment). I'm not very experienced with templating, so I get the feeling the I'm making a very stupid mistake. Regardless, if you need more of my code, or more information, let me know. Any help is greatly appreciated.

Note: I'm sure my code has plenty of bad practices, etc. in it. I'm still learning. Feel free to point them out, but I'm mostly concerned with the templating issues.


Solution

  • You're just missing a typename for the dependent name:

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