0

好吧,我正试图找出这个错误,到目前为止,我完全没有运气。我这样做是为了做作业,这就是为什么我不使用包含的课程。

以下是相关代码:

//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;

这会引发错误:“从 'Vec (*)()' 类型的右值对 'Vec&' 类型的非常量引用的初始化无效”我对 C++ 完全陌生,因此将不胜感激。

4

3 回答 3

7
Vec ret();

被视为一个函数的前向声明,它不带参数并返回一个Vec. 请参阅:最令人头疼的解析。

接下来,您将返回对局部变量的引用,这很糟糕。ret函数返回后立即超出范围。

于 2012-10-01T19:22:27.130 回答
3

实际的错误是您在运算符内部声明了一个函数,而不是声明了一个Vec对象。

Vec ret();

您可以通过省略()

Vec ret;

除此之外,您还有一个基本的设计错误,因为您试图返回对运算符范围本地变量的引用,从而导致引用悬空。表达加法运算符的常用方法是让它返回一个新对象,并且通常实现为具有签名的非成员函数,例如

Vec operator+(const Vec& lhs, const Vec& rhs);

这可以根据增量成员运算符来实现

Vec& operator+=(const Vec& rhs);

这个可以返回一个引用,this因此没有悬空引用。那么示例实现 odoperator+将是

Vec operator+(Vec lhs, const Vec& rhs)
{
    return lhs += rhs;
}
于 2012-10-01T19:22:17.340 回答
0

正如其他人所说ret,您认为默认构造 a的初始声明Vec实际上是转发一个不带参数并返回 a 的函数Vec。AKA最令人头疼的解析

此外,if 语句中 '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;
}
于 2012-10-01T19:37:53.883 回答