Re: Наследование operator=
От: Alik Украина  
Дата: 31.07.02 10:30
Оценка:
Здравствуйте PaulV, Вы писали:

PV>Столкнулся со следущей проблемой:

PV>
PV>template<typename _Tp>
PV>class aa
PV>{
PV>        _Tp* _d;
PV>public:

PV>        aa& operator= (_Tp* d) { _d=d; return *this; }
PV>};

PV>class bb : public aa<int>
PV>{
PV>};

PV>int main ()
PV>{
PV>        aa<int> a;
PV>        bb              b;
PV>        int             val = 5;

PV>        a = &val;
PV>        b = &val;
PV>}
PV>


PV>Компилятор на строке "b = &val;" естественно выдает ошибку "Could not find a match for 'bb::operator =(int *)' in function main()". Объяснение этому факту в стандарте (если я ошибаюсь — поправьте):

PV>
PV>13.5.3 Assignment [over.ass]

PV>1 An assignment operator shall be implemented by a non-static member

PV> function with exactly one parameter. Because a copy assignment opera-
PV> tor operator= is implicitly declared for a class if not declared by
PV> the user (_class.copy_), a base class assignment operator is always
PV> hidden by the copy assignment operator of the derived class.

PV>


Объяснение этому факту очень простое: операторы не наследуются.

PV>Вопрос: Как это обойти? Т.е. хочется определить в базовом классе оператор присваивания, а во всех дочерних им пользоваться.


Можно определять операторы присваивания в дочерних классах, а в имплементации приводить операнды к родителю и, соответственно, вызывать оператор присваивания у родителя.
С уважением. Алик.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.