运算符 + 在需要提升两个参数时不起作用

operator+ doesn't work when both parameters need to be promoted

本文关键字:两个 参数 不起作用 运算符      更新时间:2023-10-16

我有一个名为"Card"的类和一个名"CardDeck"的类,在"CardDeck.h"中定义了以下升级:

CardDeck(Card card){cards.push_back(card);}

CardDeck有一个朋友运营商+:

friend CardDeck operator+(const CardDeck, const CardDeck);

适用于:

CardDeck+CardDeck
CardDeck+Card
Card+CardDeck

但它不适用于卡+卡。我得到:

"no match for 'operator+' (operand types are 'Card' and 'Card')"

在这种情况下,为什么卡片没有被提升到CardDecks?我还尝试用覆盖operator+

friend CardDeck operator+(const Card, const Card);

但这也不起作用。有什么原因吗?

谢谢!

不过对我有用!

class A
{
    public:
    A() {}
};
class B
{
public:
    B(A sth) {}
};
B operator+(const B x, const B y)
{
    return B(A());
}
using namespace std;
int main()
{
    A x;
    B y(x);
    y + y;
    x + y;
    y + x;
    x + x;
    return 0;
}

除了未使用的参数和表达式外,没有任何错误。

我认为Black Moses的观点部分正确。看起来像是在用friend关键字声明类中运算符的实现。这就产生了你所说的编译错误,也就是说,你似乎在做以下事情:

class B
{
    public:
    B(A sth) { ... }
    friend int operator+(const B x, const B Y)
    {
        return 0;
    }
};

如果你使用Black Moses在他的例子中所做的,并将以下内容添加到你的类中:

friend int operator+(const B x, const B y);

那么编译错误就消失了。总结一下:在类定义内声明运算符为友元函数,然后在类外声明实现,如下所示:

int operator+(const B x, const B y)
{
    return 0;
}

希望这能有所帮助。

事实证明@PaulMcKenzie有答案(不幸的是,我不能将他的评论标记为解决方案):运算符是在类中定义的,因此它不可用于"Card"。出于某种原因,我认为在源文件中嵌入它就足以让外界知道,但这显然不是真的,因为外界对源文件一无所知。Paul提供的代码显示了解决方案:

http://ideone.com/lkr5ME

谢谢保罗!

a