2017-01-03 110 views
1

我改變了我的編譯器已經有一段時間了,但是當我這樣做時,我的代碼在早期運行良好,無法再編譯 - 我將其歸因於最近C++語言標準中的細微變化(並沒有嚴格遵守)。'operator-'不匹配

好的。過去可以正常工作的代碼是:

VECTOR operator-(const VECTOR& v){ 
    VECTOR tmp; 
    tmp.x = x - v.x; 
    tmp.y = y - v.y; 
    tmp.z = z - v.z; 
    return tmp; 
} 

這裏,X,Y,Z表示Vector類的所有公共成員

類用作:

VECTOR diff, A, B; 
diff = A - B; 

當編譯它與g ++ 6.2.0,我得到的錯誤:

error: no match for ‘operator-’ (operand types are ‘const VECTOR’ and ‘const VECTOR’) 

我跟隨各種實例發現在線(包括這裏),並實施噸他操作員通過朋友功能過載:

friend VECTOR operator-(VECTOR lhs, const VECTOR& rhs){ 
    lhs.x -= rhs.x; 
    lhs.y -= rhs.y; 
    lhs.z -= rhs.z; 
    return lhs; 
} 

這段代碼編譯得很好。我看到使用朋友函數的基本原理,但我想知道爲什麼舊的(成員函數)實現不起作用,我怎樣才能編譯它。

在此先感謝!

回答

2

的問題是,成員函數必須是const

VECTOR operator-(const VECTOR& v) const { 
            ^^^^^ 

做不到這一點,運營商不能應用到const左側的說法。

+0

謝謝,@NPE,工作! – user938720

3

成員當然應該const -qualified,如

VECTOR operator-(const VECTOR& v) const { 
            ----- 

問題不會影響你的具體的例子,但它可能會產生問題的地方,當你減去const VECTOR的。


此外,friend簽名是有點過分。幾年前有一個短暫的時期,當時推薦按價值傳遞LHS並將其返還。但是,copy elision不能像在本地變量上一樣在參數對象上工作。複製elision對於像這樣的操作員非常重要,因爲它減少了程序需要初始化的對象的數量。所以你可以試試這個表現:

friend VECTOR operator-(const VECTOR& lhs, const VECTOR& rhs){ 
    VECTOR tmp; 
    tmp.x = lhs.x - rhs.x; 
    tmp.y = lhs.y - rhs.y; 
    tmp.z = lhs.z - rhs.z; 
    return tmp; 
} 
+0

感謝@Potatoswatter的表現提示。我會試一試 – user938720