当需要提升两个参数时,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 提供的代码显示了解决方案:

http://ideone.com/lkr5ME

谢谢保罗!

a