C++ 操作员+;不';当两个参数都需要提升时,t工作

C++ 操作员+;不';当两个参数都需要提升时,t工作,c++,operators,promotions,C++,Operators,Promotions,我有一个名为“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 但这对卡+卡不起作用

我有一个名为“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')"
在这种情况下,为什么不将卡片提升为卡片组? 我还尝试使用以下命令覆盖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提供的代码显示了解决方案:

谢谢你,保罗

a

通常传递
const-CardDeck&
,即const引用到
操作符+
。这是同一主题的变体:
std::string s=“a”+“b”并期望
+
进行串联。代码是可编译的(请参阅@BlackMoses的答案)。我相信,还有别的事情在起作用。@SergeyA不,不是!对于已定义的字符串文本,没有运算符+重载——这是我的观点。两个字符串文本没有运算符“+”,即使每个字符串都可以隐式转换为
std::string
,就像两个
Card
对象没有运算符+,即使转换为
CardDeck
@PaulMcKenzie,这是因为您从未定义运算符+。这是一个有效的版本:operator+被定义为类中的朋友,并在源文件中实现,正如您所建议的。还是不行。。。奇怪的是,我甚至不能得到一个需要两张卡才能工作的重载版本。@shayelk你是什么意思?对不起,评论是错误发送的:)