3

二重リンク リストを実装するコンテナー クラスを作成しています。

template <class T>
class dl_list {
public:
    class link {
    public:
        T* data;
        link *prev, *next;
    };
    class iterator {
        link* node;
    public:
        link* get_node() { return node; }
        // ++, --, * operators, etc.
    };
    // other stuff
};

綺麗ですね、楽しんでます。しかし、私が抱えている問題の 1 つは、イテレータ型に対して等値演算子を定義するときに、テンプレートの特殊化を行う必要があることです。

template <class T>
bool operator==(typename dl_list<T>::iterator& lhv, typename dl_list<T>::iterator rhv) {
    return lhv.get_node() == rhv.get_node();
}

うまくいかないので、次のように特化する必要があります。

bool operator==(typename dl_list<int>::iterator& lhv, typename dl_list<int>::iterator rhv) {
    return lhv.get_node() == rhv.get_node();
}

使用したいすべてのタイプに対して、これは明らかな理由で面倒です。どうすればこれを回避できますか?

4

3 に答える 3

3

iteratorクラスのメンバーにします。

bool operator==( const interator& other ) const
{
    return node == other.node;
}
于 2013-03-11T10:05:21.940 に答える
2

できません。コンパイラはT、一部が他のネストされたタイプであることを認識できませんU。検討

template<> class dl_list<float> {
public:
    typedef dl_list<int>::iterator iterator;
};

イテレータタイプをテンプレートパラメータとして直接取得するか、イテレータクラスのメンバーとして定義するか、dl_listの外部でイテレータクラスを定義し、dl_list内でそのタイプデフを作成する必要があります。

于 2013-03-11T10:03:07.840 に答える
1

最も簡単でクリーンな方法は、イテレータ クラス内で演算子を定義することです。

class iterator
{
  public:
    ...
    friend bool operator==(iterator& lhs, iterator& rhs)
    {
        return lhs.get_node() == rhs.get_node();
    }
};

(ここにコードの匂いが少しあります-参照によってパラメーターを受け入れることができるバージョンget_node()があると予想していました...)constoperator==const

于 2013-03-11T10:20:57.840 に答える