"非静态引用成员,不能使用默认赋值运算符"

'non-static reference member, can't use default assignment operator'

本文关键字:默认 赋值运算符 不能 静态 引用 成员      更新时间:2023-10-16

当我试图编译我的代码时,我得到这个错误:non-static reference member ‘Timestep& Timestep::previousTimestep’, can’t use default assignment operator

我创建了一个Problem,它创建了一个Timestep,对这个Timestep的引用应该存储在向量solution中。此外,我想存储对以前的Timestep的引用-并且对于第一个时间步骤,这将是对自身的引用…

我读到,我需要定义一个自己的操作符,如果我有const成员在一个类,我试图设置相等。然而,从代码中删除了所有const元素,它仍然不起作用。有什么建议吗?非常感谢。

class Problem {
public:
    void initialTimestep(arma::vec ic);
private:
    std::vector<Timestep> solution;
};
void Problem::initialTimestep(vec ic){
    Timestep myFirstTimestep(starttime, ic, nodes);
    solution.push_back(myFirstTimestep);
}

class Timestep {
public:
    Timestep(double starttime, arma::vec initialCondition, arma::vec nodelist);
private:
    Timestep& previousTimestep; //const
};
Timestep::Timestep(double starttime, vec initialCondition, vec nodelist)
: previousTimestep(*this)
    {
    //do stuff
}

int main() {
    int k = 3; //subdomains
    vec v = linspace(0., 1., k+1); //node spacing
    vec ic= ones<vec>(k+1); //initialconditions
    Problem myProblem(v, ic, 0., 1., 0.1);
    return 0;
}

没有为您的类Timestep创建默认赋值操作符,因为它包含一个引用(稍后不能设置)。它基本上是一个指向非const数据的常量指针)。solution.push_back(myFirstTimestep)需要赋值(或与c++11一起移动),所以你必须定义自己的赋值(或移动)操作符(当然,除非你将Timestep& previousTimestep更改为Timestep *previousTimestep,否则你将无法做到这一点,在这种情况下,默认赋值也可以工作)。

您需要为Timestep类(operator=)编写自己的赋值操作符。

或者,您可以使用Timestep指针而不是Timestep类中的引用。这是我个人的偏好。由于各种原因,编译器对指针施加的规则要少得多。