3

我有一个名为“Card”的类和一个名为“CardDeck”的类,在“CardDeck.h”中定义了以下提升:

CardDeck(Card card){cards.push_back(card);}

CardDeck 有一个朋友 operator+:

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

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

谢谢!

4

3 回答 3

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

没有错误期望未使用的参数和表达式。

于 2016-01-04T21:21:04.253 回答
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;
}

希望这可以帮助。

于 2016-01-04T22:00:35.670 回答
0

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

http://ideone.com/lkr5ME

谢谢保罗!

a
于 2016-01-05T20:25:10.083 回答