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

时间:2014-03-16 14:08:57

标签: c++ initialization const

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

我创建一个Problem,其中Timestep对此Timestep的引用应存储在向量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;
}

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

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