оператор+ не работает, когда оба параметра должны быть повышены
У меня есть класс с именем "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')"
Почему в таком случае карты не повышаются до Картдеков? Я также попытался переопределить оператор+ с помощью:
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; }
Ошибки не ожидают неиспользуемых параметров и выражений.
Я думаю, что черный Моисей отчасти прав. Похоже, что вы объявляете реализацию оператора внутри класса с ключевым словом 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