当需要提升两个参数时,operator+ 不起作用
operator+ doesn't work when both parameters need to be promoted
我有一个名为 'Card' 的 class 和一个名为 'CardDeck' 的 class,在 'CardDeck.h' 中定义了以下促销:
CardDeck(Card card){cards.push_back(card);}
CardDeck有一个好友operator+:
friend CardDeck operator+(const CardDeck, const CardDeck);
适用于:
CardDeck+CardDeck
CardDeck+Card
Card+CardDeck
但它不适用于Card+Card。我得到:
"no match for 'operator+' (operand types are 'Card' and 'Card')"
在那种情况下,为什么 Cards 没有升级为 CardDeck?
我还尝试使用以下内容覆盖 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 内声明运算符的实现。这会产生您正在谈论的编译错误,即看起来您正在执行以下操作:
class B
{
public:
B(A sth) { ... }
friend int operator+(const B x, const B Y)
{
return 0;
}
};
如果您使用 Black Moses 在他的示例中所做的,并将以下内容添加到您的 class:
friend int operator+(const B x, const B y);
然后编译错误消失了。总结一下:在你的 class 定义中声明运算符一个友元函数,然后在 class 之外声明实现,就像这样:
int operator+(const B x, const B y)
{
return 0;
}
希望对您有所帮助。
原来@PaulMcKenzie 有答案(遗憾的是我无法将他的评论标记为解决方案):
该运算符是在 class 中定义的,因此它不适用于 'Card'。出于某种原因,我认为在源文件中实现它足以让外人知道它,但这显然不是真的,因为外人对源文件一无所知。
Paul 提供的代码显示了解决方案:
谢谢保罗!
a
我有一个名为 'Card' 的 class 和一个名为 'CardDeck' 的 class,在 'CardDeck.h' 中定义了以下促销:
CardDeck(Card card){cards.push_back(card);}
CardDeck有一个好友operator+:
friend CardDeck operator+(const CardDeck, const CardDeck);
适用于:
CardDeck+CardDeck
CardDeck+Card
Card+CardDeck
但它不适用于Card+Card。我得到:
"no match for 'operator+' (operand types are 'Card' and 'Card')"
在那种情况下,为什么 Cards 没有升级为 CardDeck? 我还尝试使用以下内容覆盖 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 内声明运算符的实现。这会产生您正在谈论的编译错误,即看起来您正在执行以下操作:
class B
{
public:
B(A sth) { ... }
friend int operator+(const B x, const B Y)
{
return 0;
}
};
如果您使用 Black Moses 在他的示例中所做的,并将以下内容添加到您的 class:
friend int operator+(const B x, const B y);
然后编译错误消失了。总结一下:在你的 class 定义中声明运算符一个友元函数,然后在 class 之外声明实现,就像这样:
int operator+(const B x, const B y)
{
return 0;
}
希望对您有所帮助。
原来@PaulMcKenzie 有答案(遗憾的是我无法将他的评论标记为解决方案): 该运算符是在 class 中定义的,因此它不适用于 'Card'。出于某种原因,我认为在源文件中实现它足以让外人知道它,但这显然不是真的,因为外人对源文件一无所知。 Paul 提供的代码显示了解决方案:
谢谢保罗!
a