C++ 操作员+;不';当两个参数都需要提升时,t工作
我有一个名为“Card”的类和一个名为“CardDeck”的类,在“CardDeck.h”中定义了以下提升: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 但这对卡+卡不起作用
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你是什么意思?对不起,评论是错误发送的:)