Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

[с++] перегрузка присваивания в шаблонном классе

245
31 октября 2011 года
~ArchimeD~
1.4K / / 24.07.2006
Следующий код
Код:
template <class T>
class A
{
    T i;
public:
    virtual A& operator = (const T& arg){
        i = arg;
        return *this;
   }
};

class B : public A<int>
{ };

int main (void)
{
    B Obj;
    Obj =  5;

    return 0;
}


вызовет ошибку компиляции
Цитата:

TemplateOperator.cpp: In function ‘int main()’:
TemplateOperator.cpp:23:12: error: no match for ‘operator=’ in ‘Obj = 5’
TemplateOperator.cpp:14:1: note: candidate is: B& B::operator=(const B&)



Как правильно определить в данном случае оператор присваивания в базовом классе, не переопределяя его в производном?

260
31 октября 2011 года
Ramon
1.1K / / 16.08.2003
 
Код:
class B : public A<int>
{
public:
    using A<int>::operator=;
};
245
31 октября 2011 года
~ArchimeD~
1.4K / / 24.07.2006
Цитата: Ramon
 
Код:
class B : public A<int>
{
public:
    using A<int>::operator=;
};




может я не так выразился, но ключевые слова - "не переопределяя его в производном". не хотелось бы ручками рисовать всякие юзинги во всей куче классов, вместо тех, в которых это действительно необходимо. такое возможно?

260
31 октября 2011 года
Ramon
1.1K / / 16.08.2003
Цитата: ~ArchimeD~
может я не так выразился, но ключевые слова - "не переопределяя его в производном". не хотелось бы ручками рисовать всякие юзинги во всей куче классов, вместо тех, в которых это действительно необходимо. такое возможно?



ISO/IEC 14882:2003(E):

Цитата:

13.5.3 Assignment [over.ass]
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.

8.9K
31 октября 2011 года
Apach47
130 / / 14.06.2010
Давно наследники имеют доступ к private-членам базового класса?
Может стоит попробовать объявить поле "T i" как protected?
245
01 ноября 2011 года
~ArchimeD~
1.4K / / 24.07.2006
Цитата: Ramon
ISO/IEC 14882:2003(E):



Понял, спасибо большое. придется юзать что-то вроде SetData.

245
01 ноября 2011 года
~ArchimeD~
1.4K / / 24.07.2006
Цитата: Apach47
Давно наследники имеют доступ к private-членам базового класса?
Может стоит попробовать объявить поле "T i" как protected?



не суть, в реальной ситуации так и было

240
07 ноября 2011 года
aks
2.5K / / 14.07.2006
Цитата: Apach47

Может стоит попробовать объявить поле "T i" как protected?


Не стоит без крайней необходимости.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог