c++ 非静态数据成员使用无效

a6b3iqyw  于 2022-12-30  发布在  其他
关注(0)|答案(1)|浏览(184)

下面是我的代码:

#include <iostream>
#include <memory>
#include <vector>

class var {
private:
    double value_;
    std::shared_ptr<var> left_;
    std::shared_ptr<var> right_;

public:
    var(const double& v) : value_(v){};

    friend var operator+(const var& l, const var& r) {
        var result(l.value_ + r.value_);
        left_ = std::make_shared<var>(l.value_);
        right_ = std::make_shared<var>(r.value_);
        return result;
    }

    friend std::ostream& operator<<(std::ostream& os, const var& var) {
        os << var.value_;
        return os;
    }
};

int main() { var a(1); }

我得到的错误如下:

test.cpp: In function ‘var operator+(const var&, const var&)’:
test.cpp:17:9: error: invalid use of non-static data member ‘var::r_’
   17 |         r_.push_back(std::make_shared<var>(l.value_));
      |         ^~
test.cpp:10:39: note: declared here
   10 |     std::vector<std::shared_ptr<var>> r_;
      |                                       ^~

我很难理解为什么我会得到标题中的错误。
是否有变通方案?

xwbd5t1u

xwbd5t1u1#

您的friend var operator+不是该类的成员。
为了访问数据成员,它应该指定示例
因此变更:

left_ = std::make_shared<var>(l.value_);
  right_ = std::make_shared<var>(r.value_);

收件人:

//vvvvvvv---------------------------------------
  result.left_ = std::make_shared<var>(l.value_);
  result.right_ = std::make_shared<var>(r.value_);

注:
正如@PeteBecker上文评论:在一般的算术情况下,更有效的方法是将operator+=实现为成员,然后根据它实现operator+(创建第一个参数的副本,使用operator+将第二个参数添加到它并返回它)。
在这个特定的例子中,它可能不相关,因为operator+=没有多大意义。

相关问题