Почему так? В базовом шаблонном классе есть оператор присваивания объекту класса. В наследнике он уже не работает?
Visual Studio 2010.
template<typename T>
struct Base
{
T t;
T operator=(T obj)
{
return t=obj;
}
};
template<typename T>
struct Derived : public Base<T>
{
};
int main()
{
int i = 0;
Base<int> b;
b = i; // ok
Derived<int> d;
d = i; //error: binary '=' : no operator found which takes a right-hand operand of type 'int' (or there is no acceptable conversion)
return 0;
}
Здравствуйте, x-code, Вы писали:
XC>Почему так? В базовом шаблонном классе есть оператор присваивания объекту класса. В наследнике он уже не работает?
XC>Visual Studio 2010.
вот так работает:
template<typename T>
struct Derived : public Base<T>
{
using Base::operator=;
};
Похоже собственный опрератор копирования его перекрывает.
Кстати, если его явно добавить начинает ругаться на множественные операторы присваивания. Походу он их путает, если явно объвить оператор = из родительсокго класса, все ок
Здравствуйте, saf_e, Вы писали:
_>Здравствуйте, x-code, Вы писали:
XC>>Почему так? В базовом шаблонном классе есть оператор присваивания объекту класса. В наследнике он уже не работает?
XC>>Visual Studio 2010.
_>вот так работает:
_>_>template<typename T>
_>struct Derived : public Base<T>
_>{
_> using Base::operator=;
_>};
_>
_>Похоже собственный опрератор копирования его перекрывает.
Нет. Стандратный оператор генерируется и для твоего класса Derived. В этом легко убедиться. Просто ADL не ищет в базовых классах, поэтому и не находит.
_>Кстати, если его явно добавить начинает ругаться на множественные операторы присваивания. Походу он их путает, если явно объвить оператор = из родительсокго класса, все ок
Где будет ругаться? У меня все работает и так и так.
| Код |
| template<typename T> struct Base {
T t;
T operator=(T obj) { return t=obj; }
};
template<typename T> struct Derived : public Base<T> {
typedef Base<T> B;
//T operator=(T obj) { B::t = obj ; return obj;}
using B::operator=;
};
int main() {
int i = 0;
Base<int> b,b1;
b = b1; // ok
b = i; // ok
Derived<int> d,d1;
d = i; // ok
d = d1; // ok
return 0;
}
|
| |
PS Забыл сказать — любой оператор присваивания, определенный в базовом классе прячется при наследовании. Это касается как просто assignment operator, так и copy assignment operator