1

アロケーター、イテレーターなどを使用して、STD のような方法で SkipList 実装を作成しています。クラス全体が完了し、機能していますが、現在、作成したクラスのヘッダー ファイルを作成しようとしています。私の現在のヘッダーファイルの内容は次のとおりです。

template<class _MySkiplist>
    class _Skiplist_const_iterator;

template<class _MySkiplist>
    class _Skiplist_iterator;

template<class _Kty,
    class _Pr,
    class _Alloc>
        class skiplist
        {
            typedef skiplist<_Kty, _Pr, _Alloc> _Myt;

            typedef typename _Skiplist_const_iterator<_Myt> const_iterator;
            typedef typename _Skiplist_iterator<_Myt> iterator;

            typedef typename _Alloc::size_type size_type;

            typedef std::pair<iterator, iterator> _Pairii;
            typedef std::pair<iterator, bool> _Pairib;

            skiplist();
            skiplist(const _Alloc& _Al);
            skiplist(const _Pr& _Pred);
            skiplist(const _Pr& _Pred, const _Alloc& _Al);
            ~skiplist();

            iterator begin();
            const_iterator begin() const;
            iterator end();
            const_iterator end() const;

            size_type size() const;
            size_type max_size() const;
            bool empty() const;

        //  _Pairib insert(_Kty& _val);
        //  _Pairib  insert(const _Kty& _val);
            size_type erase(const _Kty& x);
            void clear();

            _Pr key_comp() const;
            _Pr value_comp() const;

            iterator find(const _Kty& x);
            size_type count(const _Kty& x) const;
            iterator lower_bound(const _Kty& x) const;
            iterator upper_bound(const _Kty& x) const;
    //      _Pairii equal_range(const _Kty& x) const;

            _Alloc get_allocator() const;
        };

次のエラーが発生し続けます。

エラー 1 エラー C2143: 構文エラー: ';' がありません 「<」の前

エラー 3 エラー C2238: ';' の前に予期しないトークンがあります

エラー 5 エラー C2238: ';' の前に予期しないトークンがあります

エラー 2 エラー C4430: 型指定子がありません - int と見なされます。注: C++ は default-int をサポートしていません

これらのエラーはすべて、ヘッダー ファイルの次の 2 行を参照しています。

        typedef std::pair<iterator, iterator> _Pairii;
        typedef std::pair<iterator, bool> _Pairib;

エラーが発生する理由がわかりません。

4

1 に答える 1

1

これを引き起こしているエラーは、typename依存しない型名を使用していることです。

typedef typename _Skiplist_const_iterator<_Myt> const_iterator;
typedef typename _Skiplist_iterator<_Myt> iterator;

が定義されてtypenameいるヘッダーを削除して含めると、うまくいきます。<memory>std::pair

また、識別子が無効であり (アンダースコアで始まり、別のアンダースコアまたは大文字が続く識別子は予約されています)、読み取り可能な識別子の使用許可されていることにも注意してください。;-) 標準ライブラリの実装では、予約済みの識別子を使用して、クライアント コードとの衝突を回避しています。しかし、あなたはそれをすべきではありません。

于 2013-01-09T17:14:59.463 に答える