c2678二进制'=='找不到哪个运算符采用了类型的左操作数

时间:2014-04-16 16:43:21

标签: c++ linked-list doubly-linked-list

我已经好几天没有回答了我的问题......

我正在尝试搜索某个项目以进行修改。使用“列表”我需要重载运算符==但我不明白我的错误。你能告诉我怎么解决这个问题?

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);
}

2 个答案:

答案 0 :(得分:3)

下面:

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

nonPays是字符串类型,但您为另一个Nation类型重载了运算符。没有超载=需要Nationstring。两种解决方案:

您可以将转换重载为字符串(不推荐)或创建带字符串的构造函数。

最佳解决方案是为getter创建pays方法。只做il->getPays() == nomPays。简洁明了。

答案 1 :(得分:1)

您不一定要在班级中重载操作员。原因如下:您已使用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&amp;传递,这应该是至少在C ++ 11之前的字符串参数的默认值。我通过&amp;传递liste,这也更有可能是预期的行为(因为它不会创建不必要的副本)。

顺便说一下,你的Nation课很奇怪。它包含一个&#34;国家&#34; (支付)和&#34;镇&#34; (威乐)。这意味着在你的课堂设计中,一个国家由一个国家和一个城镇组成。除了城市国家之外,这没有任何意义;)


修改:我忘记了实施细节。由于仿函数无法直接访问pays的{​​{1}}成员,请考虑为您的班级提供以下成员函数:

Nation

或者将仿函数设为std::string GetPays() const { return pays; } friend