簡體   English   中英

為什么不能定義一元運算符,然后在MSVC的模板類中聲明具有相同名稱的友元二進制運算符?

[英]Why cannot I define a unary operator and then declare a friend binary operator with same name in a template class in MSVC?

考慮這樣的代碼:

template<typename S>
class C;

template<typename S>
C<S> operator-(C<S> lhs, C<S> rhs);

template<typename S>
class C
{
public:
    C operator-() { return *this; }
    friend C operator-<S>(C lhs, C rhs);//error on this line
};

template<typename S>
C<S> operator-(C<S> lhs, C<S> rhs) { return C<S>(); }

int main(int argc, char** argv)
{
    C<int> a,b;
    a-b;
    return 0;
}

這給了我MSVC 6錯誤。 但是,如果在朋友聲明之后移動C operator-()的定義,它將進行編譯。 如果將類更改為未模板化的類,則會進行編譯。 這似乎也可以在g ++中編譯。 (基於https://wandbox.org/我沒有安裝g ++)

那這怎么了?

在這里找到了一些有用的信息數據。 問題是成員運算符一元減號隱藏了全局二進制減法。 所以我必須與

friend C<S> (::operator-<S>)(C<S> lhs, C<S> rhs);

明確要求在全局范圍內使用operator-:在c ++名稱中,在類型檢查之前進行查找。

此外,由於朋友不是類的一部分(我想是原因),因此必須在返回類型和參數類型之后編寫模板參數。 沒有它們(例如, friend C (::operator-<S>)(C lhs, C rhs); ),它們仍然可以在MSVC中工作,但不適用於g ++。

這行弄亂了您的代碼:

C operator-() { return *this; }

刪除它,然后代碼會編譯(好,將a+b更改為ab )。

它試圖重載沒有操作數的算術運算符。 如果在類中聲明算術運算符,則具有一個操作數;如果在類外部聲明,則算術運算符具有兩個操作數。

運算符重載doc

不能更改運算符的優先級,分組或操作數的數量。

盡管在類中聲明了friend聲明,但它不是該類的成員函數

有關操作員oveloading的更多信息,請參閱此問題

暫無
暫無

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

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