Перегрузка оператора сравнения в C ++ приводит к «Недопустимый оператор <»

В настоящее время выполняется попытка отсортировать вектор объектов, каждый из которых содержит строку, в C ++.

Строки могут содержать буквы или цифры (из-за конструктивного ограничения это необходимо, поскольку компаратор можно изменить).

В настоящий момент класс объекта перегружен, поэтому при сравнении двух объектов сравниваются содержащиеся в них строки. Это работает до определенной степени - однако, когда я использую операцию сортировки (например, сортировку STL), чтобы упорядочить объекты, она сортирует три строки, такие как «1», «4», «12», в порядке «1», «12», «4». 4 больше 12, но так как сравнение начинается с самой левой цифры, происходит эта «неправильная» сортировка.

Моей первоначальной реакцией было изменить способ перегрузки операции сравнения. Сначала я бы проверил длину сравниваемой строки - это было бы явным признаком, если бы содержимое строки было больше или меньше.

// overloaded comparision operators
friend bool operator<(const nodeRecord & record1, const nodeRecord & record2){
    // we need to deal with strings of different lengths...
    if(record1.comparator.length() < record2.comparator.length())
        return true;
    else
        return (record1.comparator < record2.comparator);
}

Эта операция приводит к сообщению «Выражение: недопустимый оператор <» во время выполнения.

] Есть идеи относительно того, где я делаю ошибку? Похоже, я смогу указать операции, как именно должна происходить операция сортировки - даже если она недействительна, поскольку в настоящее время я использую вектор для содержания объектов.

Компаратор во время инициализации nodeRecord объект:

nodeRecord(int fromNode, int toNode, int connectionCost, bool compareByCost = false){
    // take the provided stock information and insert it into the object
    stringstream fromNodeSS;
    fromNodeSS << fromNode;
    this->fromNode = fromNodeSS.str();
    stringstream toNodeSS;
    toNodeSS << toNode;
    this->toNode = toNodeSS.str();
    this->connectionCost = connectionCost;

    // set the comparator to our chosen comparision term
    if (!compareByCost){
        this->comparator = this->fromNode; // we use from node in this case, since we build the tree outwards
    }
    else{
        stringstream ss;
        ss << this->connectionCost;
        this->comparator = ss.str(); // we use the connection cost in this case, to allow us to sort new connections
    }

    // set this as a non-null (active) record
    this->nullRecord = false;
}
7
задан BSchlinker 26 April 2011 в 20:31
поделиться