好吧,我试图弄清楚这个错误,到目前为止,绝对没有运气。我这样做是为了完成家庭作业,这就是为什么我没有使用附带的课程。
以下是相关代码:
//Will return an array where each element is the sum of the respective sums in the added arrays
Vec& Vec::operator+(Vec& v2) const{
Vec ret();
if(mySize>0){
Vec ret(mySize);
for(unsigned i = 0;i<mySize;i++){
ret[i]=v2[i]+myArray[i];
}
}
else{
}
return ret;
}
从.h文件......:
Vec& operator+ (Vec& v2) const;
这会抛出错误:&#34;从'Vec(*)()'&#34;类型的右值开始,无效初始化'Vec&amp;'类型的非const引用; 我对C ++完全陌生,所以任何帮助都会受到赞赏。
答案 0 :(得分:7)
Vec ret();
被认为是函数的前向声明,它不带参数并返回Vec
。请参阅:the most vexing parse.
接下来,您将返回对局部变量的引用,这是不好的。一旦函数返回,ret
就会超出范围。
答案 1 :(得分:3)
实际错误是您在运算符内声明了一个函数,而不是声明一个Vec
对象。
Vec ret();
您可以通过省略()
:
Vec ret;
除此之外,您还有一个基本的设计错误,即您尝试返回对运算符范围内的变量的引用,从而产生悬空引用。表达加法运算符的常用方法是让它返回一个新对象,并且通常实现为具有签名的非成员函数,例如
Vec operator+(const Vec& lhs, const Vec& rhs);
这可以通过增量成员运算符
来实现Vec& operator+=(const Vec& rhs);
这个可以返回对this
的引用,因此没有悬空引用。然后,operator+
的示例实现将是
Vec operator+(Vec lhs, const Vec& rhs)
{
return lhs += rhs;
}
答案 2 :(得分:0)
正如其他人所说的那样,您认为ret
的初始声明是默认构造Vec
实际上正在转发一个不带参数并返回Vec
的函数。 AKA most vexing parse。
if语句中的'{3}}'ret'也意味着你没有修改你期望返回的变量。你可能想要更像这样的东西:
Vec Vec::operator+(const Vec& v2) const{
Vec ret(mySize);
if(mySize>0){
for(unsigned i = 0;i<mySize;i++){
ret[i]=v2[i]+myArray[i];
}
}
else{
}
return ret;
}