【问题标题】:'non-static reference member, can't use default assignment operator''非静态引用成员,不能使用默认赋值运算符'
【发布时间】:2014-04-21 16:28:33
【问题描述】:

当我尝试编译我的代码时出现此错误: 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;
}

【问题讨论】:

    标签: c++ initialization constants


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 感谢您的回答。关于使用move 的评论很有帮助。最后我用这个solution.emplace_back(starttime, ic, nodes) 来解决我的问题(需要C++ 11)。似乎它也是形成性能观点的首选方式。此外,它还解决了 const 元素的问题。
      猜你喜欢
      • 2010-10-12
      • 1970-01-01
      • 2018-01-20
      • 2010-12-22
      • 2012-09-19
      • 2012-09-25
      • 2014-10-28
      • 2011-12-15
      • 2021-04-04
      相关资源
      最近更新 更多