Я пытаюсь перегрузить оператор + в классе леса, лес представляет собой коллекцию деревьев, а оператор + должен объединить два леса в один. У меня есть следующий код, мое определение класса:Перегрузка + оператор на универсальном классе в C++
template<typename NODETYPE>
class Forest
{
public:
friend Forest& operator+<>(Forest&, Forest&);
friend ostream& operator<<<>(ostream&, const Forest&);
friend istream& operator>><>(istream&, Forest&);
Forest();
Forest(const Forest& otherForest);
~Forest();
void nodes(int&) const;
private:
ForestNode<NODETYPE> *root;
ForestNode<NODETYPE> *getNewNode(const NODETYPE &);
};
Ниже приводится моя реализация оператора +:
template<typename NODETYPE>
Forest& operator+<>(Forest& f1, Forest& f2)
{
f3 = new Forest();
f3.root = *f1.*root;
f3.root.sibling = *f2.*root;
*f1.root = 0;
*f2.root = 0;
return f3;
}
Я получаю следующее сообщение об ошибке на компиляции:
|28|error: expected constructor, destructor, or type conversion before '&' token|
линия 28 относится к подписи моего оператора + реализации.
Я думаю, чтобы исправить это я должен добавить к типу возвращаемого, что дает:
template<typename NODETYPE>
Forest<NODETYPE>& operator+<>(Forest& f1, Forest& f2)
{
f3 = new Forest();
f3.root = *f1.*root;
f3.root.sibling = *f2.*root;
*f1.root = 0;
*f2.root = 0;
return f3;
}
Но это дает мне следующие ошибки:
|28|error: declaration of 'operator+' as non-function| |28|error: missing template arguments before '&' token| |28|error: 'f1' was not declared in this scope| |28|error: missing template arguments before '&' token| |28|error: 'f2' was not declared in this scope|
Может кто-нибудь помочь мне с этим? Я был бы очень благодарен.
Почему вы динамически выделяете, а затем пытаетесь вернуть указатель на «Лес» вместо ссылки? И эта функция не должна возвращать ссылку в любом случае, ссылаться на нее нечего: когда вы добавляете две вещи, вы обычно получаете новое значение *, поэтому возвращайте значение. Это * плохое * дополнение, вы манипулируете аргументами. ('2 + 2' наверняка не изменит' 2'!) Возможно, вам нужна функция 'comb' member. – GManNickG
Выделение нового леса в кучу и возврат ссылки - очень плохая идея. Просто создайте локальный объект и верните его значение. –
Или используйте интеллектуальные указатели, если копирование стоит дорого. –