C++ 为什么赢了';t重载运算符>;参数声明为常量时是否工作?

C++ 为什么赢了';t重载运算符>;参数声明为常量时是否工作?,c++,operator-overloading,C++,Operator Overloading,我正在写一个程序来模拟一个玩纸牌的把戏游戏。在决定技巧赢家的函数中,我创建了一个列表,列出了所有牌的花色与牌的花色相匹配的牌。然后,我将该列表按等级降序排序,然后返回列表中的第一张卡片(即,在与该套装匹配的卡片中,等级最高的卡片)。这是代码的相关部分: #include <list> enum Suits { Clubs, Diamonds, Hearts, Spades }; class Card { private: const Sui

我正在写一个程序来模拟一个玩纸牌的把戏游戏。在决定技巧赢家的函数中,我创建了一个
列表
,列出了所有牌的花色与牌的花色相匹配的牌。然后,我将该列表按等级降序排序,然后返回
列表中的第一张卡片(即,在与该套装匹配的卡片中,等级最高的卡片)。这是代码的相关部分:

#include <list>

enum Suits
{
    Clubs,
    Diamonds,
    Hearts,
    Spades
};

class Card
{
private:
    const Suits suit;
    const int rank;
    friend Card determineWinner(Card led, Card other1, Card other2, Card other3);
public:
    Card(Suits cardsSuit, int cardsRank) : suit(cardsSuit), rank(cardsRank) {}
    bool operator > (const Card& compareTo)
    {
        return (rank > compareTo.rank);
    }
};

Card determineWinner(Card led, Card other1, Card other2, Card other3)
{
    Suits ledSuit = led.suit;
    list<Card> eligible = { led };
    // add the cards whose suit matches the suit led to the list of cards eligible to win the trick
    if (other1.suit == ledSuit)
        eligible.push_back(other1);
    if (other2.suit == ledSuit)
        eligible.push_back(other2);
    if (other3.suit == ledSuit)
        eligible.push_back(other3);
    // sort the list of cards eligible to win the trick in descending order by rank
    eligible.sort([](const Card& card1, const Card& card2) {return (card1 > card2);});
    // the highest ranked eligible card is first in the list after the sort
    auto winner = eligible.begin();
    return *winner;
}
#包括
枚举诉讼
{
俱乐部,
钻石,
心,
黑桃
};
班级卡
{
私人:
康斯特西服;
常数整数秩;
朋友卡确定按钮(卡led、卡other1、卡other2、卡other3);
公众:
卡牌(套装卡牌,国际卡牌银行):套装卡牌,等级卡牌银行{}
布尔运算符>(常数卡和比较)
{
返回(排名>比较排名);
}
};
卡确定指示灯(卡指示灯、卡其他1、卡其他2、卡其他3)
{
西服led西服=led西服;
符合条件的列表={led};
//将其花色与花色相匹配的牌添加到有资格赢得该把戏的牌列表中
如果(其他1.suit==ledSuit)
合格。推回(其他1);
如果(其他2.suit==ledSuit)
合格。推回(其他2);
如果(其他3.suit==ledSuit)
合格。推回(其他3);
//按等级降序排列有资格赢得该技巧的牌的列表
符合条件的。排序([](常数卡和卡1,常数卡和卡2){返回(卡1>卡2);});
//排名最高的合格卡位于排序后列表的第一位
自动赢家=合格。开始();
返回*赢家;
}
当我试图运行这段代码时,我得到一个编译错误:
E0349:没有运算符“>”匹配这些操作数
。如果我在用作排序谓词的lambda函数中将
card1
card2
声明为非
const
,则代码将按预期编译和执行。在
Card
operator>
的定义中,我是否可以更改一些东西,以允许使用
card1
card2
声明的
const
进行编译,或者我是否应该保持足够好的状态

这需要声明为常量成员函数。签名中未附加
const
限定符的成员函数不能在
const
对象上调用,因为没有此限定符,编译器无法确定该函数中的对象状态是否没有更改,如果签名中包含
const
,编译器将强制执行此约定,如果您试图更改此函数中对象的状态,编译器将无法编译

更正后的代码如下所示:

bool operator > (const Card& compareTo) const
{
    return (rank > compareTo.rank);
}
这需要声明为常量成员函数。签名中未附加
const
限定符的成员函数不能在
const
对象上调用,因为没有此限定符,编译器无法确定该函数中的对象状态是否没有更改,如果签名中包含
const
,编译器将强制执行此约定,如果您试图更改此函数中对象的状态,编译器将无法编译

更正后的代码如下所示:

bool operator > (const Card& compareTo) const
{
    return (rank > compareTo.rank);
}

您的
运算符>
需要声明为
const
成员函数。另一方面,我要声明它不是一个成员函数,而是一个自由函数(可能是
朋友
),您的操作符重载也需要是常量。旁注:您应该重载其他关系运算符,如
和不比较
@PaulMcKenzie没有什么意义。我已经定义了其他关系运算符,但没有将它们包含在我提供的摘录中,以避免用额外的代码阻塞问题。您的
运算符>
需要声明为
const
成员函数。另一方面,我要声明它不是一个成员函数,而是一个自由函数(可能是
朋友
),您的操作符重载也需要是常量。旁注:您应该重载其他关系运算符,如
和不比较
@PaulMcKenzie没有什么意义。我已经定义了其他关系运算符,但没有将它们包含在我提供的摘录中,以避免用额外的代码阻塞问题。当我将运算符声明为
const
时,我还可以用它来比较
类卡的非
const
实例吗?是-请参阅S.Meyers的书《有效C++@train1855是》中的第3项
T&
可以隐式地分配给
T const&
,而不使用
const
-casting或其他类似机制,这意味着像
void do\u something(std::string const&str)
这样的函数将绑定到像
std::string str=“Howdy!”这样的调用;做某事(str),没有问题。因此,在您的情况下,
bool操作符>(Card const&Card)const
将起作用,无论左侧是否为
const
,或者右侧是否为
const
,我还可以用它来比较
类卡的非
const
实例吗?是-请参阅S.Meyers的书《有效C++@train1855是》中的第3项
T&
可以隐式地分配给
T const&
,而不使用
const
强制转换或其他类似机制,这意味着像
void do\u something(std::string const&str)这样的函数将绑定到