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

Bai*_*ang 5 c++ inheritance templates

我有以下模板代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

但编译失败并显示错误消息(VS2008):

错误C2679:二进制"=":没有操作员发现它采用类型>>"类名*"的右边的操作数(或没有可接受的转化率)

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

ava*_*kar 12

它得到了继承.但是,编译器生成的赋值运算符用于TempaltePtr_ClassName隐藏继承的运算符.您可以通过添加使其可见

using TempaltePtr<ClassName>::operator=;
Run Code Online (Sandbox Code Playgroud)

你的派生类.

  • 这也有将"TemplatePtr <T> :: operator =(Template <T> const&)"带入范围的缺点,这可能是不需要的. (3认同)
  • @lz_prgmr,以及构造函数和析构函数没有名称,因此无法隐藏.唯一的其他特殊成员函数是operator =.Operator&不是特殊的成员函数 - 编译器不生成一个. (3认同)
  • @lz_prgmr,是的,默认构造函数,复制构造函数,析构函数和复制赋值运算符是唯一的*特殊成员函数*(这是它们被标准引用的术语). (2认同)

Chu*_*dad 8

除非提供显式使用声明,否则operator =始终由派生类实现隐藏.对于类模板和普通类都是如此.

顺便说一句,你的运营商声明=非常非标准.对于"A"级,通常会声明它.

A& operator=(A const &);
Run Code Online (Sandbox Code Playgroud)

这可能是你正在寻找的东西(和编译)

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
} 
Run Code Online (Sandbox Code Playgroud)