如何在C ++中解决“对二进制表达式无效的操作数”?

时间:2019-10-11 20:53:35

标签: c++ class sorting vector std

我有一个基础class和一个继承它的子class。我已经覆盖了基础<中的运算符><=>=class,目的是std::sort将{{ 1}}。当我vector时,我会打电话给std::sort

但是,我不断收到错误std::sort(my_vector.begin(), my_vector.end())。对于尝试执行该排序的每个位置,我也都会收到8个错误和整个子错误文章。例如,我得到了invalid operands to binary expression ('const my_sub_class' and 'const my_sub_class'),它似乎是各种子函数。

我希望我只是错过了一个包含,但是除了in instantiation of member function 'std::__1::greater<my_sub_class>::operator()' requested here, if (__comp(*--__last, *__first))(d'uh)和#include <vector>外,我不知道我还需要什么。我已经通过#include <algorithm>分别尝试了重载运算符,并且它们可以工作。 if也可以工作。我还尝试了各种解决方案,例如重载子类中的运算符,并提供显式的排序功能(例如vector<my_sub_class>,自己的功能,通过greater<my_sub_class>和{{1}的反向排序顺序}),但似乎无济于事(尽管我的某些解决方案给出了不同的错误(变化太多,无法在此包含所有错误)。

编辑:

这里有一些代码可以重现错误 头文件:

rbegin()

类文件:

rend()

当我从主干运行时,我得到:

#ifndef H_DEBUGGING
#define H_DEBUGGING

class my_class {
  public:
    void set_value(int in_value);
    int get_value();
    bool operator < (const my_class & in_my_class);
    bool operator > (const my_class & in_my_class);
    // Some other stuff

  protected:
    int mValue;
    my_class();
    // Some other stuff
};

class my_sub_class: public my_class {
  public:
    my_sub_class();
    // Some other stuff
  protected:
    // Some other stuff
};

void debug_custom_class_vector();

#endif

当我取消注释类文件中的#include <algorithm> #include <iostream> #include <vector> #include "Debugging.hpp" my_class::my_class() { } void my_class::set_value(int in_value) { mValue = in_value; } int my_class::get_value() { return mValue; } bool my_class::operator < (const my_class & in_my_class) { return mValue < in_my_class.mValue; } bool my_class::operator > (const my_class & in_my_class) { return mValue > in_my_class.mValue; } my_sub_class::my_sub_class() { } void debug_custom_class_vector() { my_sub_class sub_a, sub_b, sub_c; sub_a.set_value(2); sub_b.set_value(1); sub_c.set_value(3); std::vector<my_sub_class> my_custom_vector; my_custom_vector.push_back(sub_a); my_custom_vector.push_back(sub_b); my_custom_vector.push_back(sub_c); std::cout << "Unsorted: " << std::endl; for (int i = 0; i < 3; i++) { std::cout << i << ": " << my_custom_vector[i].get_value() << std::endl; } // std::sort(my_custom_vector.begin(), my_custom_vector.end(), std::greater<my_sub_class>()); std::cout << "Sorted: " << std::endl; for (int i = 0; i < 3; i++) { std::cout << i << ": " << my_custom_vector[i].get_value() << std::endl; } } // Some other stuff 行时,我得到了错误。

我该怎么解决?

1 个答案:

答案 0 :(得分:0)

std::sort要求运算符为const方法。声明

virtual bool operator < (classA a);
virtual bool operator < (const classA& a);
virtual bool operator < (classA& a) const;

这三个声明都不适合您的情况,要么无法编译,要么不起作用。您需要:

virtual bool operator < (const classA& a) const;

此外,您可能需要将复制/移动操作符设为虚拟...

此外,首先,您不应该编写虚拟比较运算符(它会降低性能,排序可能会降低10到100倍)。更好地使用lambda函数进行自定义排序。仅在某些非常奇怪的情况下,您才必须诉诸虚拟函数。老实说,我不知道为什么需要比较运算符进行虚拟排序...我认为您在某个地方出错。

因此,您最好检查一下C ++ 11中的lambda函数并重新设计代码。