У меня есть класс с именем «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);
но это тоже не работает.
любой намек почему?
Спасибо!
Работает на меня, хотя!
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;
}
Нет ошибок, ожидайте неиспользуемые параметры и выражения.
Я думаю, что у Черного Моисея это частично верно. Похоже, вы объявляете реализацию оператора внутри класса с ключевым словом 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;
}
Надеюсь это поможет.
Оказывается, у @PaulMcKenzie был ответ (к сожалению, я не могу отметить его комментарий как решение):
Оператор был определен внутри класса, поэтому он не был доступен для «Карты». По какой-то причине я подумал, что реализации его в исходном файле будет достаточно, чтобы он был известен посторонним, но это, очевидно, неправда, поскольку посторонние ничего не знают об исходном файле.
код, предоставленный Полом, показывает решение:
Спасибо, Пол!
a