当需要提升两个参数时,operator +不起作用

时间:2016-01-04 21:02:23

标签: 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

但它不适用于卡+卡。我明白了:

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

为什么在这种情况下卡片不会被提升为CardDecks? 我还尝试使用:

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

但这也不起作用。 任何暗示为什么?

谢谢!

3 个答案:

答案 0 :(得分:3)

虽然适合我!

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;
}

没有错误需要未使用的参数和表达式。

答案 1 :(得分:1)

我认为黑摩西的部分正确。看起来您正在使用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;
}

希望这有帮助。

答案 2 :(得分:0)

事实证明@PaulMcKenzie得到了答案(不幸的是我无法将他的评论标记为解决方案): 操作符是在类中定义的,因此它不适用于“卡”。出于某种原因,我认为在源文件中实现它将足以让外人知道它,但这显然不是真的,因为外人对源文件一无所知。 Paul提供的代码显示了解决方案:

http://ideone.com/lkr5ME

谢谢保罗!

a