簡體   English   中英

C++ 重載運算符與關聯性相反的順序

[英]C++ overloaded operator with reverse order of associativity

想出一個標題非常困難......(我的母語不是英語。)

struct A
{
    int value;
    A operator+(int i) const
    {
        A a;
        a.value=value+i;
        return a;
    };
};
int main(){
    A a;
    a.value=2;
    a=a+2;
    return 0;
}

此代碼按預期編譯/工作,但是當我將 a=a+2 更改為 a=2+a 時,它將不再編譯。 GCC 給了我這個錯誤:

no match for ”operator+” in ”2 + a”

有沒有辦法讓 2+a 像 a+2 一樣工作?

你需要一個自由函數,之后定義

struct A
{
   // ...
};

A operator+(int i, const A& a)
{
  return a+i; // assuming commutativity
};

另外,您可以考慮定義A& operator+=(int i); A實現兩個版本的operator+作為免費功能。 您可能還對 Boost.Operators 或其他簡化A助手感興趣,請參閱我的個人資料以了解兩個選項。

當然,在類外定義逆運算符:

struct A
{
    int value;
    A operator+(int i) const
    {
        A a;
        a.value=value+i;
        return a;
    };
};
//marked inline to prevent a multiple definition
inline A operator+(int i, const A& a)
{
    return a + i;
}

這里的其他答案工作正常。 但是,您還有另一個選擇是為單個int創建一個構造函數,如下所示:

struct A
{
    int value;
    A(int i) {
        value = i;
    }
};

這允許整數隱式轉換,並允許您只為您的struct重載運算符:

A operator+(const A& other) const
{
    // All you need to do is work with an A, and associativity works fine
};

當然,這確實允許所有整數隱式轉換為A s,這可能是也可能不是可取的。

暫無
暫無

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

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