2017-02-16 79 views
0

是否可以爲運算符定義運算符tilde ~?例如,我在我的例子中枚舉了State,我希望能夠編寫result &= ~STATE_FAIL;。 我做了這樣的事情:爲枚舉重載波浪號「〜」運算符

#include <iostream> 

    enum State 
    { 
     STATE_OK      = 0x0, 
     STATE_FAIL     = 0x1,  
     STATE_LOW     = 0x2, 
     STATE_HIGH     = 0x4  
    }; 

    State & operator|=(State & a, const State b) 
    { 
     a = static_cast<State>(static_cast<int>(a) | static_cast<int>(b)); 
     return a; 
    } 

    State & operator&=(State & a, const State b) 
    { 
     a = static_cast<State>(static_cast<int>(a) & static_cast<int>(b)); 
     return a; 
    } 
    State & operator~(State& a) 
    { 
     a = static_cast<State>(~static_cast<int>(a)); 
     return a; 
    } 


int main() 
{ 
    State result = STATE_OK; 

    result |= STATE_FAIL; // ok 
    result &= STATE_FAIL; // ok 
    result &= ~STATE_FAIL; // fail 

    return 0; 
} 

我收到以下錯誤:

In function int main() : Line 35: error: invalid conversion from int to State compilation terminated due to -Wfatal-errors.

+0

枚舉的鑄件中的其他問題,但它並不顯示了結通過值的參數和返回值而不是@tuple_cat的答案中的引用對此問題。創建正確的_bitwise NOT_'operator〜'時,這很重要。 –

回答

3

你要通過取參數作爲一個非const引用(不能結合而造成的錯誤臨時表示,其表達爲STATE_FAIL)。

您的operator~實施中還存在問題:例如,您的operator~修改了不是~的常規行爲的參數,如here所示。

這應該以預期的方式工作,即它不會修改其參數,並且僅返回操作的結果:

State operator~(const State a) 
{ 
    return static_cast<State>(~static_cast<int>(a)); 
} 
+0

在玩過這個例子之後,似乎有一個非const的'State&'作爲'operator〜'的參數可以防止它被使用。這個答案是正確的,你必須擺脫參考。 –

+0

使用非const參數作爲參數並不妨礙使用'operator〜'。正如答案中所解釋的那樣,它只能防止臨時(右值表達式)作爲參數傳遞,因爲rvalues不能作爲非常量引用傳遞。 – emlai