c2678 двоичный '==' не найден оператор, который принимает левый операнд типа

уже несколько дней я продолжаю решать свою проблему без ответа...

Я пытаюсь найти элемент, чтобы изменить его. Со «списком» мне нужно перегрузить оператор ==, но я не понимаю своей ошибки. Не могли бы вы рассказать мне, как я могу решить это?

class Nation{
private :
    short continent;
    unsigned int population, superficie;
    string pays, ville;
public :
list<Nation>    lireRemplir(list<Nation>liste, const char nomALire[]);

Nation(short continent, unsigned int population, unsigned int superficie, string pays, string ville) {
    ..... // ok
    }
Nation(){};
void modifierContinent(list<Nation> liste, string nomPays, short nouveauContinent);
bool operator == (Nation &); //?

};

bool Nation::operator == (Nation & autre) {
    return this->pays == autre.pays;
}

void modifierContinent(list<Nation> liste, string nomPays, short nouveauContinent)
{
    //Nation uneNation(0,0,0,nomPays,"");
    for (list<Nation>::iterator il = liste.begin(); il != liste.end(); il++)
    {
        if (*il == nomPays){ cout << "found!"; }    
    }
}

int main()
{
    list<Nation>liste;
    liste=lireRemplir(liste, "Nation.txt"); //hidden but working
    modifierContinent(liste, "FRANCE", 5);
}

person caps lock    schedule 16.04.2014    source источник
comment
Какая строка выдает какую именно ошибку?   -  person Tim    schedule 16.04.2014
comment
Во-первых, передавать такие вещи, как std::list, по ссылке или константной ссылке, а не по значению (как вы делаете сейчас в своей функции modifierContinent)   -  person PaulMcKenzie    schedule 16.04.2014
comment
Не имеет отношения к делу, лучшей подписью будет bool Nation::operator == (const Nation & autre) const   -  person Mooing Duck    schedule 16.04.2014


Ответы (2)


Здесь:

if (*il == nomPays){ cout << "found!"; } 

nomPays — это строка типа, но вы перегрузили оператор для другого типа Nation. Не существует перегруженного =, который принимает Nation и string.

Два решения:

Вы можете либо перегрузить преобразование в строку (не рекомендуется), либо создать конструктор, который принимает строку.

Лучшее решение — создать метод getter для pays только для выполнения il->getPays() == nomPays. Четко и лаконично.

person yizzlez    schedule 16.04.2014

Вам не обязательно перегружать оператор в своем классе. Вот почему: вы уже используете std::list. Это хорошо. Теперь сделайте еще один шаг вперед и также откажитесь от собственного алгоритма в пользу стандартного: std::find_if.

std::find_if может выполнять поиск в стандартном классе контейнеров, используя предоставленный вами функтор сравнения. Часто этот функтор представляет собой struct с перегруженным operator() (так что его объекты можно использовать как функции).

Я приведу вам пример:

#include <algorithm> // for std::find_if

// ...

struct CountryComparison
{
    CountryComparison(std::string const &country) : m_country(country) {}

    bool operator()(Nation const &nation) const
    {
        return nation.pays == m_country;
    }

    std::string m_country;
};

void modifierContinent(list<Nation> &liste, string const &nomPays, short nouveauContinent)
{
    list<Nation>::const_iterator find_iter = std::find_if(liste.begin(), liste.end(),
        CountryComparison(nomPays));

    if (find_iter != liste.end())
    {
        cout << "found!";
    }
}

Я также убедился, что строки передаются с помощью const&, что должно быть значением по умолчанию для строковых аргументов, по крайней мере, до C++11. И я пропускаю liste через &, что также более вероятно, как и предполагалось (поскольку он не создает ненужных копий).

Кстати, у вас Nation класс странный. Он содержит «страну» (pays) и «город» (ville). Это означает, что в вашем дизайне классов нация состоит из страны и города. Это не имеет смысла, за исключением, может быть, городов-государств;)


Изменить: я забыл детали реализации. Поскольку функтор не может напрямую обращаться к pays члену Nation, рассмотрите возможность предоставления вашему классу функции-члена, например:

std::string GetPays() const
{
    return pays;
}

Или сделайте функтор friend из Nation.

person Christian Hackl    schedule 16.04.2014