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

dan*_*ani 5 c++ initialization const

尝试编译代码时出现此错误: non-static reference member ‘Timestep& Timestep::previousTimestep’, can’t use default assignment operator

我创建ProblemTimestep一个引用,该引用Timestep应存储在vector中solution。此外,我想存储对先前的引用Timestep-对于第一个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;
}
Run Code Online (Sandbox Code Playgroud)

exa*_*ple 5

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