2010-04-27 60 views
4

我試圖創建一個重載的一元 - 操作符,但無法獲得編譯的代碼。代碼的簡化版本如下: -C++一元 - 操作符重載不會編譯

class frag 
{ 
    public: 

     frag myfunc (frag oper1, 
         frag oper2); 
     frag myfunc2 (frag oper1, 
         frag oper2); 

     friend frag operator + (frag &oper1, 
           frag &oper2); 

     frag operator -() 
     { 
      frag f; 
      f.element = -element; 
      return f; 
     } 

    private: 

     int element; 

}; 

frag myfunc (frag oper1, frag oper2) 
{ 
    return oper1 + -oper2; 
} 

frag myfunc2 (frag oper1, frag oper2) 
{ 
    return oper1 + oper2; 
} 

frag operator+ (frag &oper1, frag &oper2) 
{ 
    frag innerfrag; 
    innerfrag.element = oper1.element + oper2.element; 
    return innerfrag; 
} 

編譯報道...

/home/brian/Desktop/frag.hpp: In function ‘frag myfunc(frag, frag)’: 
/home/brian/Desktop/frag.hpp:41: error: no match for ‘operator+’ in ‘oper1 + oper2.frag::operator-()’ 
/home/brian/Desktop/frag.hpp:16: note: candidates are: frag operator+(frag&, frag&) 

任何人都可以提出什麼,我需要在這裏做什麼?

回答

7

常量,正確性

這必須是

frag operator+ (const frag &oper1, const frag &oper2); 

否則操作數不能是臨時對象,例如作爲回報價值的operator-

和一元減而應是:

frag operator -() const; 

,因爲它不應該改變操作數。

3

您沒有可以臨時操作的operator+。暫時不能作爲非常量參考傳遞。

更改您的operator+到的簽名:

frag operator + (const frag &oper1, const frag &oper2); 
0

已經給出了答案(const參數),但是我想提一下,Visual C++ 9(VS-2008)確實會在沒有警告的情況下編譯上述內容。

+0

這是VC++ 2008中的一個缺陷,現在更正爲VC++ 2010。 – 2011-06-10 19:16:10

1

雖然你的問題已經得到了相當好的回答,但我認爲值得一提的是關於你的代碼的另一點。現在,你有如下聲明:

class frag 
{ 
    public: 

     frag myfunc (frag oper1, 
         frag oper2); 
     frag myfunc2 (frag oper1, 
         frag oper2); 

和......你具備以下功能:

frag myfunc (frag oper1, frag oper2) 
{ 
    return oper1 + -oper2; 
} 

frag myfunc2 (frag oper1, frag oper2) 
{ 
    return oper1 + oper2; 
} 

我猜您預期這兩個函數來實現你所聲明的成員函數在frag - 但他們沒有。相反,你有兩個成員函數是從未定義聲明的,而這兩個成員函數恰好具有相似的名稱。對他們來說,你聲明的成員函數,你需要聲明更改爲類似:

frag frag::myfunc(frag oper1, frag oper2) { 
    return oper1 + -oper2; 
} 

frag frag::myfunc2(frag oper1, frag oper2) { 
    return oper1 + oper2; 
} 

在另一方面,這些不真正使任何意義上,無論是方式 - 特別是,作爲成員函數,它們通常會被調用爲:a.myfunc(b,c);它們都是像全局函數那樣寫的 - 作爲成員函數,它們通常只帶一個參數,並且使用this作爲第一個參數:

frag frag::myfunc1(frag oper) { 
    return *this + -oper; 
} 
frag frag::myfunc2(frag oper) { 
    return *this + oper; 
} 

當然,這可能只是一個意外的si從試圖將原始代碼減少到發佈所需的最小值的效果。如果是這樣,請隨時忽略這整個「答案」....

+1

我認爲你是對的,因爲我創造了一個最小的罪犯,因爲這沒有出現在我的實質性版本中,但是無論如何感謝你提及它。 – 2010-04-29 09:11:30