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

很漂亮,我玩得很开心。但是我遇到的一个问题是,当我为迭代器类型定义相等运算符时,我必须进行模板特化。

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

你不能。编译器无法知道 someT是 some other 的嵌套类型U。考虑

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

您必须将迭代器类型直接作为模板参数,或者将其定义为迭代器类的成员,或者在 dl_list 之外定义迭代器类,并在 dl_list 内部为其创建一个 typedef。

于 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()有一个const版本,允许operator==通过const引用接受参数......)

于 2013-03-11T10:20:57.840 回答