非静态引用成员,无法使用默认赋值运算符。

6
当我尝试编译代码时,出现了以下错误:non-static reference member 'Timestep& Timestep::previousTimestep',can't use default assignment operator 我创建了一个Problem,它创建了一个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个回答

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

1
感谢您的回答。有关使用 move 的评论很有帮助。最终,我使用了这个 solution.emplace_back(starttime, ic, nodes) 来解决我的问题(需要 C++11)。从性能角度来看,这似乎也是首选的方式。此外,它还解决了常量元素的问题。 - dani

4

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接