2016-11-23 4 views
0

Я изучаю, как использовать шаблоны и как перегружать операторы. Мне удалось перегрузить operator[], но я столкнулся с проблемой перегрузки operator+ и operator=. Вот мой код:Перегрузка операторов '=' и '+'

template <class T> 
class A 
{ 
public: 
    //... 
    friend A<T>& A<T>::operator+ (A<T>&, const A<T>&); 
    friend A<T>& A<T>::operator= (A<T>&, const A<T>&); 
}; 

template<class T> A<T>& A<T>::operator+ (A<T>& left, const A<T>& right) 
{ 
    //some functions 
return left; 
} 

template<class T> A<T>& A<T>::operator= (A<T>& left, const A<T>& right) 
{ 
    //some functions 
    return left; 
} 

Whenver Я пытаюсь скомпилировать, я получаю эти ошибки:

'+': is not a member of 'A<T>'

'=': is not a member of 'A<T>'

'operator =' must be a non-static member

Что я делаю неправильно?


EDIT:

мне удалось обновить код:

template <class T> 
class A 
{ 
public: 
    //... 
    A<T> operator+ (A<T>); 
    A<T> operator= (A<T>, const A<T>); 
}; 

template<class T> A<T> A<T>::operator+ (A<T> right) 
{ 
    //some functions 
    return *this; 
} 

template<class T> A<T> operator= (A<T> right) 
{ 
    //some functions 
    return *this; 
} 

Выглядит как operator+ работ в настоящее время хорошо, но компилятор дает эту ошибку:

'operator=' must be a non static member

Почему это статический член и как его исправить?

+0

Удалить 'A ::' сферы в определениях функций. –

+0

Ах, извините, я забыл. Параметры шаблона не являются «унаследованными» в объявлениях 'friend'.Вы должны объявить их как 'template друг A & operator + (A &, const A &);' –

+0

Уверены ли вы в этом? Я получаю в настоящее время внутренней ошибки компилятора: P Nevermind, теперь он по-прежнему вызывает ошибки в «не является членом»:/ – Executor1909

ответ

1

Для операторов присваивания пускатели должны быть не статические функции-члены

От стандарта C++ (13.5.3 Назначение)

1 An assignment operator shall be implemented by a non-static member function with exactly one parameter. Because a copy assignment operator operator= is implicitly declared for a class if not declared by the user (12.8), a base class assignment operator is always hidden by the copy assignment operator of the derived class.

А во-вторых (11,3 друзей)

1 A friend of a class is a function or class that is given permission to use the private and protected member names from the class. A class specifies its friends, if any, by way of friend declarations. Such declarations give special access rights to the friends, but they do not make the nominated friends members of the befriending class.

Таким образом, например, это определение

template<class T> A<T>& A<T>::operator+ (A<T>& left, const A<T>& right) 
         ^^^^^ 
{ 
//some functions 
return left; 
} 

неверен. По крайней мере, вы должны удалить A<T>::, потому что оператор не является членом класса.

+0

Да, я совсем забыл об этом. Итак, теперь я удалил друга и «A ::», но я все еще получаю последнюю ошибку, этот оператор = должен быть нестационарным членом. Как я могу сделать это не статическим? На самом деле, я посмотрел на моего оператора [] Definiton и там тоже такая же ошибка, но по какой-то причине компилятор позвольте мне сделать это: P Теперь она также производит эту ошибку «не статический член»: C – Executor1909

+0

@ Executor1909 Подробнее один цитата из Стандарта. Оператор должен иметь только один параметр. –

+0

Да, я знаю, но я изменил это только, чтобы проверить, исчезли ли эти предыдущие ошибки, теперь у них есть только один параметр. Ошибка «нестационарная» – Executor1909

0

Оператор, который реализован как нестатический элемент, должен принимать только один входной параметр, правый операнд. Левым операндом является объект this, вызываемый оператором.

Оператор, который реализован как статический член или нечлен, должен принимать 2 входных параметра, левый и правый операнды.

Ваш operator= объявлен как нестатический элемент с 2 входными параметрами, что неверно.

Кроме того, operator+ предназначен для возврата нового объекта, который является копией двух входных объектов, добавленных вместе. Не возвращайте ссылку на объект, на который вызывается оператор. В то время как operator= предназначен для возврата ссылки на объект, которому назначено.

Попробуйте это:

template <class T> 
class A 
{ 
public: 
    //... 
    A<T> operator+(const A<T>&) const; 
    A<T>& operator=(const A<T>&); 
}; 

template<class T> A<T> A<T>::operator+(const A<T>& right) const 
{ 
    A<T> result(*this); 
    //some functions to add right to result as needed... 
    return result; 
} 

template<class T> A<T>& A<T>::operator=(const A<T>& right) 
{ 
    // some functions to copy right into this... 
    return *this; 
} 
Смежные вопросы