为什么operator =不会从模板类继承 [英] Why operator = doesn't get inherited from a template class

查看:204
本文介绍了为什么operator =不会从模板类继承的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下模板代码:

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):

but compile fails with error message (VS2008):



错误C2679:binary'=':无操作符,它接受类型为>> ClassName *'的右手操作数或没有可接受的转换)

error C2679: binary '=' : no operator found which takes a right-hand operand of type >>'ClassName *' (or there is no acceptable conversion)


为什么它不工作,在模板基类中?

Why it won't work as I have defined an operator in the template base class?

推荐答案

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

operator = is always hidden by the derived class implementation unless explicit using declaration is provided. This is true for both class templates and ordinary classes.

BTW,你的statement =的声明是非标准的。它通常被声明为类'A'。

BTW, your declaration of operator= is very nonstandard. It is usually declared so for a class 'A'.

A& operator=(A const &);

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

Here is something that may be what you are looking for (and compiles)

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
} 

这篇关于为什么operator =不会从模板类继承的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆