0

ベクター (クラス プロジェクト) に非常によく似たコンテナー クラスを作成しており、イテレーター サブクラスを定義しています。ctor の 1 つは 2 つの iterator 引数を取り、それらが表す半開放範囲を使用してデータ構造 (二重リンク リスト) を構築します。

以下のコードは、insert(iterator, iterator) が Sol::iterator 型の 2 つのイテレーターで呼び出された場合に (ほぼ) 機能します (何らかの理由で、*ita は常に正しい値を指しますが、insert(*ita) 呼び出しはそうではありません)。値を追加していないようです??)。(より大きな) 問題は、挿入呼び出しがすべてのイテレータ タイプ (例: vector::iterator) に対して機能する必要があることであり、それを機能させる方法を追跡できませんでした。typedef / typename T::iterator iterator を試してみましたが、最も静かな g++ は 'typename T::iterator iterator' を使用したもので、戻ります

g++ ex1.cc -o sol -Wall -Wextra -ansi -pedantic
In file included from ex1.cc:1:0:
Sol.h:87:16: error: expected ‘)’ before ‘ita’
ex1.cc:109:5: error: expected ‘}’ at end of input
In file included from ex1.cc:1:0:
Sol.h:84:3: error: expected unqualified-id at end of input
make: *** [ex1] Error 1

これはあまり意味がありません。少なくとも私には。大まかなストロークは次のとおりです。

template <class T, int find_val = 1, class Compare = std::less<T> >
class Sol{

public:
    typedef unsigned int size_type; //typedef'ing class variable types
    typedef T key_type; 
    typedef T value_type; 
    //typename T::iterator iter;

private:

    struct node{ //Used as 'links' in the chain that is the doubly linked list
        T data;
        node *prev;
        node *next;
    };

    node *head, *tail; //The head and tail of the dll
    int find_promote_value; //How much should find() shift a value?

public:
    class iterator{
        private:
            node *no;
            friend class Sol;
            iterator(node *p) : no(p){
            }
        public:
            iterator() : no(0){
            }

            iterator operator++(){ //Preincrement
                no = no->next;
                return *this;
            }

            iterator operator++(int){ //Postincrement
                iterator temp = *this;
                ++*this;
                return temp;
            }

            iterator operator--(){  //Predecrement
                no = no->prev;
                return *this;
            }

            iterator operator--(int){  //Postdecriment
                iterator temp = *this;
                --*this;
                return temp;
            }

            T operator*(){
                return no->data;
            }

            T *operator->(){
                return &no->data;
            }

            bool operator==(const iterator &rhs){
                return no == rhs.no;
            }

            bool operator!=(const iterator &rhs){
                return no != rhs.no;
            }       
    };

    Sol() : head(0), tail(0), find_promote_value(find_val){
    }

    Sol(const Sol &rhs) : head(rhs.head), tail(rhs.tail), find_promote_value(rhs.find_promote_value){
    }

    typename T::iterator iterator;
    Sol(iterator ita, iterator itb){ //Sol.h::87. Problem line
        while (ita != itb){
            iterator itr = insert(*ita);
std::cout << "Inserting " << *ita << ",printout: " << *itr <<"\n";
//dump();
            ++ita;
        }
    }

    ~Sol(){
        clear();
    }

    iterator insert(T input){
        node *n = new node;
        n->next = NULL;
        n->prev = tail;
        n->data = input;

        if(!tail){
            head = n;
            tail = n;
        }
        else{
            tail->next = n;
            tail = n;
        }

        return iterator(tail);
    }
   };
4

2 に答える 2

2

(より大きな) 問題は、挿入呼び出しがすべてのイテレータ タイプ (例: vector::iterator) に対して機能する必要があることであり、それを機能させる方法を追跡できませんでした。

これがすべてのイテレータ タイプで機能する必要があるという事実は、それがテンプレート化された関数であることを示しています。insert()コンテナーによって提供される関数を見ると、std::listそのうちの 1 つに次の宣言があることがわかります。

template <class InputIterator>
void insert(iterator position, InputIterator first, InputIterator last);

その型が関数が使用する操作を提供する限り、firstand (挿入するハーフオープン範囲を指定する)に任意の型を使用できます。同様のことを行うことを検討する必要があります。関数がこれらのパラメーターに対して次のことのみを行う限り、ほとんどすべてのイテレーターを使用できるはずです (出力イテレーターを除く)。lastinsert()insert()

  • 比較
  • 逆参照
  • インクリメント
于 2012-04-27T00:22:21.650 に答える
1

iteratorクラスの最後にセミコロンがありません。

于 2012-04-26T23:59:16.213 に答える