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」の名前の実装がその行にあります(コメントで指摘されています)。私はテンプレートの経験があまりないので、非常にばかげた間違いを犯しているような気がします。とにかく、私のコードや情報がさらに必要な場合は、お知らせください。どんな助けでも大歓迎です。

注:私のコードには、悪い習慣などがたくさん含まれていると確信しています。まだ勉強してる。それらを指摘するのは自由ですが、私は主にテンプレートの問題に関心があります。

4

1 に答える 1

1

typename従属名のa が欠落しています:

template <class key_type, class T>
typename myMap<key_type,T>::rbNode* myMap<key_type,T>::LL_Rotation(rbNode * curr)
^^^^^^^^
于 2012-04-24T03:45:11.110 に答える