Как решить "недопустимые операнды в двоичном выражении" в C ++? - PullRequest
0 голосов
/ 11 октября 2019

У меня есть база class и суб-class, которая наследует его. Я переопределил операторы <, >, <= и >= в базе class, с целью std::sort использования vector с этим классом. Когда я std::sort, я делаю это, вызывая std::sort(my_vector.begin(), my_vector.end()).

Однако я продолжаю получать ошибку invalid operands to binary expression ('const my_sub_class' and 'const my_sub_class'). Я также получаю около 8 ошибок и целое эссе ошибок на каждое место, где я пытаюсь реализовать сортировку. Например, я получаю in instantiation of member function 'std::__1::greater<my_sub_class>::operator()' requested here, if (__comp(*--__last, *__first)), который, кажется, является различными подфункциями.

Я надеюсь, что я только что пропустил включение, но кроме #include <vector> (d'uh) и #include <algorithm> Iне могу понять, что еще мне нужно. Я пробовал перегруженные операторы отдельно через if, и они работают. vector<my_sub_class> тоже работает. Я также пробовал различные решения, такие как перегрузка операторов в подклассе и предоставление явной функции сортировки (например, greater<my_sub_class>, собственные функции, обратный порядок сортировки через 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

Когда я запускаюсь с основного, я получаю:

Unsorted: 
0: 2
1: 1
2: 3
Sorted: 
0: 2
1: 1
2: 3

и когда я раскомментирую строку std::sortв файле класса я получаю ошибку.

Что я могу сделать, чтобы ее решить?

1 Ответ

0 голосов
/ 12 октября 2019

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 раз для сортировки). Лучше использовать лямбда-функции для индивидуальной сортировки. Только в некоторых действительно странных случаях вам приходится прибегать к виртуальным функциям. Честно говоря, я не знаю, зачем вам нужен виртуальный оператор сравнения для сортировки ... Я думаю, что вы где-то допустили ошибку.

Так что вам лучше проверить лямбда-функции в C ++ 11 и перепроектироватьтвой код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...