首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >基类中的重载赋值运算符

基类中的重载赋值运算符
EN

Stack Overflow用户
提问于 2019-06-24 09:03:57
回答 1查看 47关注 0票数 2

我有一个名为BaseSignal的模板类,

代码语言:javascript
复制
  template <class T>
  class BaseSignal
  {
    public:
    // Constructor
    BaseSignal(long buf_size, bool is_async, SimData *sim)
    ....

从这个类派生出另外两个模板化的类:NetReg。(对于感兴趣的人,我将在Verilog中对并发和顺序赋值的行为进行建模)。它们被定义为

代码语言:javascript
复制
  template <class T>
  class Net : public BaseSignal<T>
  {
    public:
    Net(long buf_size, bool is_async, SimData* sim)
      : BaseSignal<T>(buf_size, is_async, sim) {};
      ....

对于Reg也是如此。

在基类中,我将SetGet方法定义为虚拟的,

代码语言:javascript
复制
    // Virtual settors
    virtual void Set(long val) {};
    virtual void Set(double val) {};

    // Virtual gettors
    virtual void Get(long* val) const {};
    virtual void Get(double* val) const {};

因为NetReg对这些有不同的行为。所以这里是有趣的部分。

+=重载在基类中工作

在基类中,我定义了这个操作符来调用虚拟的SetGet操作,它按预期工作。

BaseSignal

代码语言:javascript
复制
    BaseSignal<T>& operator+=(const double& rhs)
    {
      T rval;
      this->Get(&rval);
      this->Set(rval + static_cast<T>(rhs));
      return *this;
    }
    BaseSignal<T>& operator+=(const long& rhs)
    {
      T rval;
      this->Get(&rval);
      this->Set(rval + static_cast<T>(rhs));
      return *this;
    }

在我的代码中,我有指针net_realnet_int,当我这样做时

代码语言:javascript
复制
  *net_real += 1.1;
  *net_int += 1l;

净值正确递增。奇怪的是

=重载在基类中不起作用

正如预期的那样,在Net类中重载=工作得很好:

代码语言:javascript
复制
    Net<T>& operator=(const double& rhs)
    {
      this->Set(static_cast<T>(rhs));
      return *this;
    }
    Net<T>& operator=(const long& rhs)
    {
      this->Set(static_cast<T>(rhs));
      return *this;
    }

但如果我把这个放到BaseSignal

代码语言:javascript
复制
    BaseSignal<T>& operator=(const double& rhs)
    {
      this->Set(static_cast<T>(rhs));
      return *this;
    }
    BaseSignal<T>& operator=(const long& rhs)
    {
      this->Set(static_cast<T>(rhs));
      return *this;
    }

我可以很好地编译这个类文件,但是当我编译main.cpp时,我得到的是:

代码语言:javascript
复制
ctests/main.cpp: In function 'int main()':
ctests/main.cpp:28:15: error: no match for 'operator=' (operand types are 'cpysim::Net<double>' and 'double')
   28 |   *net_real = 1.0;
      |               ^~~
In file included from ctests/main.cpp:9:
csrc/signals_nets.hpp:456:9: note: candidate: 'constexpr cpysim::Net<double>& cpysim::Net<double>::operator=(const cpysim::Net<double>&)'
  456 |   class Net : public BaseSignal<T>
      |         ^~~
csrc/signals_nets.hpp:456:9: note:   no known conversion for argument 1 from 'double' to 'const cpysim::Net<double>&'
csrc/signals_nets.hpp:456:9: note: candidate: 'constexpr cpysim::Net<double>& cpysim::Net<double>::operator=(cpysim::Net<double>&&)'
csrc/signals_nets.hpp:456:9: note:   no known conversion for argument 1 from 'double' to 'cpysim::Net<double>&&'

我不是100%确定我理解了“候选人”这部分。它是否正在尝试调用复制构造函数?更令人费解的是,为什么它适用于+=而不是=

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56728781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档