оператор + не работает, когда необходимо продвигать оба параметра

У меня есть класс с именем «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

но это не будет работать для Card + Card. Я получил:

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

Почему в этом случае карты не переводятся в CardDecks?
Я также попытался переопределить оператор + с помощью:

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

но это тоже не работает.
любой намек почему?

Спасибо!

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

Нет ошибок, ожидайте неиспользуемые параметры и выражения.

3

Другие решения

Я думаю, что у Черного Моисея это частично верно. Похоже, вы объявляете реализацию оператора внутри класса с ключевым словом friend. Это создает ошибку компиляции, о которой вы говорите, т.е. кажется, что вы делаете следующее:

class B
{
public:
B(A sth) { ... }

friend int operator+(const B x, const B Y)
{
return 0;
}

};

Если вы используете то, что сделал Черный Моисей в своем примере, и добавьте в свой класс следующее:

friend int operator+(const B x, const B y);

тогда ошибка компиляции исчезнет. Подводя итог: объявите оператор дружественной функцией внутри определения вашего класса, а затем объявите реализацию вне класса, вот так:

int operator+(const B x, const B y)
{
return 0;
}

Надеюсь это поможет.

1

Оказывается, у @PaulMcKenzie был ответ (к сожалению, я не могу отметить его комментарий как решение):
Оператор был определен внутри класса, поэтому он не был доступен для «Карты». По какой-то причине я подумал, что реализации его в исходном файле будет достаточно, чтобы он был известен посторонним, но это, очевидно, неправда, поскольку посторонние ничего не знают об исходном файле.
код, предоставленный Полом, показывает решение:

http://ideone.com/lkr5ME

Спасибо, Пол!

a
0
По вопросам рекламы [email protected]