为什么operator =不从模板类继承

时间:2010-11-08 08:20:19

标签: c++ templates inheritance

我有以下模板代码:

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:二进制'=':找不到哪个运算符采用类型&gt;&gt;'ClassName *'的右手操作数(或者没有可接受的转换)

  

为什么它不起作用,因为我在模板基类中定义了一个运算符?

2 个答案:

答案 0 :(得分:12)

它被继承了。但是,TempaltePtr_ClassName的编译器生成的赋值运算符隐藏了继承的运算符。您可以通过添加

使其可见
using TempaltePtr<ClassName>::operator=;

到派生类。

答案 1 :(得分:8)

operator =始终由派生类实现隐藏,除非提供了明确的using声明。对于类模板和普通类都是如此。

顺便说一句,您对operator =的声明非常不标准。对于'A'类,通常会声明它。

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
}