Здравствуйте 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>Вопрос: Как это обойти? Т.е. хочется определить в базовом классе оператор присваивания, а во всех дочерних им пользоваться.
Можно определять операторы присваивания в дочерних классах, а в имплементации приводить операнды к родителю и, соответственно, вызывать оператор присваивания у родителя.
С уважением. Алик.