我正在实现通用的双向链接列表,并且由于>和<< / strong>运算符而出现错误。有人可以帮我吗?
注意:我不允许使用任何STL函数
typename SortedList<T>::iterator SortedList<T>::insert(const T& data) {
iterator it = begin();
if (head_->next_ == tail_) {
Node* newNode = new Node(data, tail_, head_);
head_->next_ = newNode;
tail_->prev_ = newNode;
it.curr_ = newNode;
++size_;
return it;
}
else {
while (it != end()) {
if ((*it < data) && (*it > data || it.curr_->next_ == tail_)) { // this line is giving me error
Node* newNode = new Node(data, it.curr_->next_, it.curr_);
it.curr_->next_->prev_ = newNode;
it.curr_->next_ = newNode;
it.curr_ = newNode;
++size_;
return it;
}
it++;
}
}
}
答案 0 :(得分:1)
看起来T不小于或大于可比性。
我该如何解决?
T
具有可比性如何使T小于和大于T?
例如,如果您使用类foo
作为T
来实例化模板,那么您就需要使foo
具有可比性。
这可以通过定义bool operator<()(const foo&,const foo&)
使其小于可比性和定义bool operator>()(const foo&,const foo&)
使其大于可比性来实现。请注意,这些函数可能需要实现严格的弱排序关系,以使算法正常工作。
此外,您可以在算法中使用b < a
而不是a > b
,因此只需要一个方向的可比性。
这是一个通用的双向链接列表,因此它应该适用于所有数据类型,对吗?
并非所有类型都具有可比性。您的函数将比较类型的对象,因此不能:您的模板不适用于所有数据类型。它仅适用于可比较的数据类型。
如果您要使用比较对象,则您的链表也可以用于可写比较对象的非可比较类型。
你能解释一下如何制作比较对象吗?
让我们以类foo
为例。您可以通过编写重载以下函数调用运算符的类(让我们将其称为Comp
)来为此类创建比较对象:
bool Comp::operator()(const foo&, const foo&) const
与使foo
具有可比性一样,此函数还必须实现严格的弱排序关系。此类的实例是一个比较对象。一个lambda就足够了。
您应该在列表模板中使用模板参数,以使模板的用户提供可以比较类型T
的对象的比较对象。将对象存储为列表的成员,仅使用比较对象而不是关系运算符来比较列表的元素。