ошибка создания собственной структуры и реляционной перегрузки - PullRequest
0 голосов
/ 09 марта 2012

Я получил следующий код и получаю сообщение об ошибке: «ошибка C2676: двоичный файл>>:« const Car »не определяет этот оператор или преобразование в тип, приемлемый для предопределенного оператора» *

Это всплывает на: if (vec [i]> returnValue) /.../ line

Я понимаю, что может быть запутано, как сравнивать структуру Car, но не должен ли последний обратный вызов/ перегрузка позаботится об этом?Предложения?

#include <vector>
#include <iostream>
#include <string>

struct Car {
    std::string name;
    int weight;
    int airbags;
};

//callback for typical compairsons
template <typename Type>
int CmpCallBack(Type one, Type two) {
    if (one < two) return -1;
    if (one == two) return 0;
    if (one > two) return 1;
}

//itterate through vec<Type> and return max value
template <typename Type>
Type FindMax(std::vector<Type> const &vec, int (cmpFn)(Type one, Type two) = CmpCallBack) {
    Type returnValue = new Type; //is this the right way to initialize this var?
    for (int i = 0; i < vec.size(); i++) {
        if (vec[i] > returnValue) {
            returnValue = vec[i];
        }
    }
    return returnValue;
}

//callback for the custom "Car" struct
int CarAirComp(Car one, Car two) {
    if (one.airbags < two.airbags) return -1;
    if (one.airbags == two.airbags) return 0;
    if (one.airbags > two.airbags) return 1;
}

int main () {

        //build a vector of Car types
    std::vector<Car> cars;
    Car x;
    x.airbags = 5;
    x.name = "car one";
    Car y;
    y.airbags = 3;
    y.name = "car two";
    Car z;
    z.airbags = 1;
    z.name = "car three";
    cars.push_back(x);
    cars.push_back(y);
    cars.push_back(z);

        //test function
    Car returnVal = FindMax(cars, CarAirComp);

    std::cout << "value: " << returnVal.name << std::endl;

    system("pause");
    return 0;
}

1 Ответ

2 голосов
/ 09 марта 2012

У вас нет operator >, определенного для Car.Компилятор не знает, как оценить (vec[i] > returnValue).Если вы определите этот оператор, у вас должно быть все в порядке:

struct Car {
    ...
    bool operator >(const Car & other) const 
    {
       // compare them however you like
       return weight < other.weight; 
    }
}

Кроме того, вам необходимо изменить это:

Type returnValue = new Type;

на

Type returnValue;  // this default constructs the object

Обновление:

Поскольку у вас есть доступная функция сравнения, вам не нужно писать operator >.Вместо этого используйте функцию сравнения:

if(cmpFn(vec[i], returnValue) > 0) {
    returnValue = vec[i];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...