我有一个基础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
行时,我得到了错误。
我该怎么解决?
答案 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函数并重新设计代码。