У меня возникла странная проблема. У меня есть стек литералов, который содержит целые числа, парный, Rationnals и т.д. Я определил оператор +, чтобы быть в состоянии сделать Double + Integer, Integer + Integer и т.д. Но когда я делаю:оператор + не распознает типы
Litteral& pop1 = stack.top();
stack.pop();
Litteral& pop2 = stack.top();
stack.pop();
Litteral& toAdd = (*pop1.clone() + *pop2.clone());
I получить:
не подходит для 'оператора +' (типы операндов 'Litteral' и 'Litteral') Litteral & toAdd = (* pop1.clone() + * pop2.clone());
Он не распознает типы, даже с помощью clone(). И мой оператор + является виртуальным. Вот как я определил оператор +:
class Integer;
class Litteral {
public:
virtual QString toString() const = 0;
virtual int getValue() const = 0;
virtual Litteral * clone() const = 0;
virtual Litteral& operator+(const Integer& l) = 0;
};
class Integer: public Litteral {
friend class LitteralManager;
int value;
public:
...
virtual Integer& operator+(const Integer& e);
Integer* clone() const;
};
Вот клон(), потому что я использую фабричную модель:
Integer* Integer::clone() const {
return new Integer(*this);
}
Кто-нибудь есть ключ? Спасибо за помощь.
Ничего себе. У вас так много ошибок в коде. Я предлагаю начинать с нуля, может быть, с чем-то более простым. – juanchopanza
У вас есть 'operator +', который принимает 'Litteral' и' Integer'. Нет никого, кто берет «Litteral» с обеих сторон. –
Кроме того, ваша программа (после ее компиляции) будет демонстрировать неопределенное поведение. Вы берете ссылку на элемент 'top()', а затем немедленно уничтожаете этот элемент с помощью 'pop()', а затем переходите к использованию ссылки теперь. –