运算符 + 在需要提升两个参数时不起作用
operator+ doesn't work when both parameters need to be promoted
我有一个名为"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
相关文章:
- 为什么模板参数推导不适用于仅指定前两个参数的可变参数模板类?
- C++如何在 switch 语句中放置两个参数
- 为什么我不能用两个参数重载 C++ 运算符 []?
- C++添加检查以避免读取两个参数
- 宏的定义从一个值创建两个参数
- C++ 如何使用一个参数从派生类构造函数中调用具有两个参数的超类构造函数
- 通过将两个参数包的元素线程化为类型对来解压缩这两个参数包
- 'int main(int, int, std::__cxx11::string, std::__cxx11::string)'只需要零或两个参数 [-Wmain]
- 错误:函数调用中有两个参数
- Qt 线程两个参数
- 为什么lambda函数用于stl函数,例如sort(),c 中的max_element()函数以两个参数为输入
- 警告:用两个参数构造函数返回对象时,表达结果未使用
- 具有两个参数的 Decltype 修改类型
- 将两个参数传递到谓词remove_if
- 同时扩展两个参数包
- 用两个参数调用新操作员,但没有分配
- 在Variadic模板中交换两个参数
- C CPPUNIT_ASSERT具有两个参数
- 具有两个参数的乘法函数
- 使用一个可选参数获取两个参数到main