首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >‘非静态引用成员,不能使用默认赋值运算符’

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

Stack Overflow用户
提问于 2014-03-16 22:08:57
回答 2查看 10.9K关注 0票数 5

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

我创建了一个Problem,它创建了一个Timestep,指向这个Timestep的引用应该存储在向量solution中。此外,我还想存储对前一个Timestep的引用--对于第一个Timestep来说,这将是对其自身的引用……

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

代码语言:javascript
复制
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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-16 22:21:06

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

票数 6
EN

Stack Overflow用户

发布于 2014-03-16 22:21:43

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22437903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档