代码之家  ›  专栏  ›  技术社区  ›  Baiyan Huang

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

  •  5
  • Baiyan Huang  · 技术社区  · 14 年前

    我有以下模板代码:

    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;
    }
    

    错误C2679:二进制“=”:找不到接受“ClassName*”类型的右手操作数的运算符(或没有可接受的转换)

    为什么当我在模板基类中定义了一个运算符时它就不能工作?

    2 回复  |  直到 13 年前
        1
  •  8
  •   Chubsdad    14 年前

    除非提供显式using声明,否则派生类实现始终隐藏operator=。对于类模板和普通类都是这样。

    顺便说一下,您对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
    } 
    
        2
  •  12
  •   avakar    14 年前

    它被继承了。但是,编译器生成的赋值运算符 TempaltePtr_ClassName

    using TempaltePtr<ClassName>::operator=;
    

    你的派生类。