Почему operator = не наследуется от класса шаблона - PullRequest
5 голосов
/ 08 ноября 2010

У меня есть следующий код шаблона:

class ClassName{};

template <class T>
class TemplatePtr
{
public:
    void operator=(T* p)
    {

    }
};

class TemplatePtr_ClassName: public TemplateePtr<ClassName>
{
public:
    ~TempaltePtr_ClassName();
};


void Test()
{
    TemplatePtr_ClassName data;
    data = new ClassName;
}

, но компиляция завершается неудачно с сообщением об ошибке (VS2008):

ошибка C2679: двоичный файл '=': не найден оператор, который принимает правый операнд типа >> 'ClassName *' (или нет приемлемого преобразования)

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

Ответы [ 2 ]

12 голосов
/ 08 ноября 2010

Получается по наследству. Однако сгенерированный компилятором оператор присваивания для TempaltePtr_ClassName скрывает унаследованный оператор. Вы можете сделать это видимым, добавив

using TempaltePtr<ClassName>::operator=;

в ваш производный класс.

8 голосов
/ 08 ноября 2010

operator = всегда скрыт реализацией производного класса, если не указано явное использование объявлений. Это верно как для шаблонов классов, так и для обычных классов.

Кстати, ваша декларация оператора = очень нестандартная. Обычно это объявляется для класса «А».

A& operator=(A const &);

Вот то, что вы можете искать (и компилировать)

template <class T> 
class TemplatePtr 
{ 
public: 
    TemplatePtr& operator=(TemplatePtr const &) 
    {return *this;} 
}; 

template<class T>
class TemplatePtr_ClassName: public TemplatePtr<T> 
{ 
public:
   ~TemplatePtr_ClassName(){};
   TemplatePtr_ClassName& operator=(TemplatePtr_ClassName const &that){
      TemplatePtr<T>::operator=(that);        // invoke base class assignment operator
      return *this;
   }
}; 


int main() 
{ 
    TemplatePtr_ClassName<int> data; 
    data = *new TemplatePtr_ClassName<int>; 
    // delete stuff
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...