оператор+ не работает, когда оба параметра должны быть повышены


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

Ошибки не ожидают неиспользуемых параметров и выражений.

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

Http://ideone.com/lkr5ME

Спасибо Пол!

a