二进制> T未定义此运算符或未转换为预定义运算符可接受的类型

时间:2019-02-25 01:45:47

标签: c++ c++11

我正在实现通用的双向链接列表,并且由于>和<< / 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++;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

看起来T不小于或大于可比性。

  

我该如何解决?

  1. T具有可比性
  2. 或使用比较对象比较元素,就像标准排序的容器一样。
  

如何使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的对象的比较对象。将对象存储为列表的成员,仅使用比较对象而不是关系运算符来比较列表的元素。