簡體   English   中英

非常量引用的無效初始化

[英]invalid initialization of non-const reference

好吧,我正在嘗試找出此錯誤,到目前為止,絕對沒有運氣。 我這樣做是為了做作業,這就是為什么我不使用包含類。

以下是相關代碼:

//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 ++來說是全新的,因此可以提供任何幫助。

Vec ret();

被認為是不帶參數且返回Vec的函數的前向聲明。 請參閱: 最令人討厭的解析。

接下來,您將返回對局部變量的引用,這很糟糕。 函數返回后, ret就會超出范圍。

實際的錯誤是您在運算符內部聲明了一個函數,而不是聲明了Vec對象。

Vec ret();

您可以通過省略()來解決此問題:

Vec ret;

除此之外,您還有一個基本的設計錯誤,因為您試圖返回對運算符作用域本地變量的引用,從而導致引用懸空。 表示加法運算符的通常方法是讓它返回一個新對象,並且通常實現為具有簽名的非成員函數,例如

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

這可以通過增量成員運算符來實現

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

該參考可以返回this的引用,因此沒有懸掛參考。 一個示例實現od operator+將是

Vec operator+(Vec lhs, const Vec& rhs)
{
    return lhs += rhs;
}

正如其他人所說的那樣,您最初認為是ret的初始聲明,您認為這是默認構造Vec的事實,實際上正轉發了一個不帶任何參數並返回Vec的函數。 也就是最令人討厭的解析

同樣,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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM