我正在创建一个实现双链表的容器类。
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();
}
对于我想要使用它的每种类型,这显然是令人讨厌的原因。我该如何解决这个问题?
答案 0 :(得分:3)
让它成为iterator
类的成员:
bool operator==( const interator& other ) const
{
return node == other.node;
}
答案 1 :(得分:2)
你做不到。编译器无法知道某些T
是某些其他U
的嵌套类型。考虑
template<> class dl_list<float> {
public:
typedef dl_list<int>::iterator iterator;
};
您必须直接将iterator类型作为模板参数,或者将其定义为迭代器类的成员,或者在dl_list之外定义迭代器类,并在dl_list中为它创建一个typedef。
答案 2 :(得分:1)
最简洁的方法是在迭代器类中定义运算符:
class iterator
{
public:
...
friend bool operator==(iterator& lhs, iterator& rhs)
{
return lhs.get_node() == rhs.get_node();
}
};
(这里有一些代码味道 - 我希望get_node()
有一个const
版本,允许operator==
通过const
引用接受参数。 。)