Наследование шаблонных классов, непонятное поведение
От: x-code  
Дата: 06.02.15 10:09
Оценка:
Почему так? В базовом шаблонном классе есть оператор присваивания объекту класса. В наследнике он уже не работает?
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;
}
Re: Наследование шаблонных классов, непонятное поведение
От: saf_e  
Дата: 06.02.15 10:22
Оценка:
Здравствуйте, x-code, Вы писали:

XC>Почему так? В базовом шаблонном классе есть оператор присваивания объекту класса. В наследнике он уже не работает?

XC>Visual Studio 2010.

вот так работает:

template<typename T>
struct Derived : public Base<T>
{
    using Base::operator=;
};


Похоже собственный опрератор копирования его перекрывает.

Кстати, если его явно добавить начинает ругаться на множественные операторы присваивания. Походу он их путает, если явно объвить оператор = из родительсокго класса, все ок
Re: Наследование шаблонных классов, непонятное поведение
От: stapter  
Дата: 06.02.15 10:35
Оценка:
Здравствуйте, x-code, Вы писали:

XC>Почему так? В базовом шаблонном классе есть оператор присваивания объекту класса. В наследнике он уже не работает?


Потому что у твоего оператора сигнатура int operator = (Base<int>&, int),
а тебе надо int operator = (Derived<int>&, int)
Re[2]: Наследование шаблонных классов, непонятное поведение
От: andyp  
Дата: 06.02.15 14:06
Оценка: -1
Здравствуйте, 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
Отредактировано 06.02.2015 14:15 andyp . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.