"非静态引用成员,不能使用默认赋值运算符"
'non-static reference member, can't use default assignment operator'
当我试图编译我的代码时,我得到这个错误:non-static reference member ‘Timestep& Timestep::previousTimestep’, can’t use default assignment operator
我创建了一个Problem
,它创建了一个Timestep
,对这个Timestep
的引用应该存储在向量solution
中。此外,我想存储对以前的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;
}
没有为您的类Timestep
创建默认赋值操作符,因为它包含一个引用(稍后不能设置)。它基本上是一个指向非const数据的常量指针)。solution.push_back(myFirstTimestep)
需要赋值(或与c++11一起移动),所以你必须定义自己的赋值(或移动)操作符(当然,除非你将Timestep& previousTimestep
更改为Timestep *previousTimestep
,否则你将无法做到这一点,在这种情况下,默认赋值也可以工作)。
您需要为Timestep类(operator=
)编写自己的赋值操作符。
或者,您可以使用Timestep指针而不是Timestep类中的引用。这是我个人的偏好。由于各种原因,编译器对指针施加的规则要少得多。
相关文章:
- 默认赋值运算符如何在实际 STL 中实现
- 如果类在 C++ 中具有常量或引用类型的非静态数据成员,为什么编译器不提供默认赋值运算符?
- C++不同类型的默认赋值运算符
- 将默认赋值运算符声明为 constexpr:哪个编译器是正确的?
- 默认赋值运算符有权访问基类的私有成员
- 错误:非静态引用成员"std::ostream&Student::out",无法使用默认赋值运算符
- 默认的复制构造函数和复制赋值运算符给出奇怪的错误
- 在这种情况下,我们需要禁用默认的复制构造函数和赋值运算符
- 错误:非静态引用成员,无法使用默认赋值运算符
- 如果成员具有非平凡的noexcept赋值运算符,则默认的移动赋值不能显式为noexcept
- 外部C结构的C++默认复制/移动赋值运算符不是常量
- 如果类具有引用数据成员,为什么编译器不合成默认赋值运算符
- 模板赋值运算符不替换默认赋值运算符
- 删除默认C++复制和移动构造函数和赋值运算符的缺点
- 具有不同模板参数的模板类的默认赋值运算符
- 重载赋值运算符或使用默认运算符
- 为什么我不能在 C++ 中使用模板版本覆盖默认的复制构造函数和赋值运算符
- c++默认的复制和赋值运算符
- 当类成员是引用时,是否无法生成默认赋值运算符?(在C++中)
- "非静态引用成员,不能使用默认赋值运算符"