2013-03-11 52 views
-2

我只是用+操作&打我無法弄清楚如何聲明和使用它「明確」 請幫的代碼如下:明確的運營商+在C++

class compex{ 

    int real; 
    int img; 

public: 
    compex(); 
    compex(int,int); 
    compex& explicit operator + (const compex& P1) 
    friend ostream& operator <<(ostream& out,const compex& R); 
}; 

和實現的運算符是:

compex& compex :: operator + (const compex& P1) 
{ 
    this->real += P1.real; 
    this->img += P1.img; 
    return *this; 
} 
+2

您是否收到錯誤消息?如果是這樣的錯誤?或者還有其他的事情你正在努力? – 2013-03-11 17:31:37

+3

你的問題是什麼? – Mic 2013-03-11 17:31:40

+3

你的代碼有幾個問題,請解釋你的意思是'明確的'以及你有什麼確切的問題。 – 2013-03-11 17:31:51

回答

2

您不能使(這些)運算符explicit(只有轉換運算符可以在C++ 11中明確)。你不需要。簡單地避免顯式轉換到您的類型,方法是:

  • 沒有定義轉換操作符爲其他類型,並且..
  • 標誌着複雜的構造都可以用一個參數explicit調用。

這樣一來,就可以有效地只能調用operator+與已經complex類型。

+0

不幸的是,C++也允許轉換運算符作爲全局函數,並作爲「from」類型的成員函數。禁止轉換爲「複雜」是非常棘手的,只有在試圖爲'operator +'強制執行時纔會變得棘手。 – 2013-03-11 17:46:38

+0

我明白了,好的,謝謝。 – 2013-03-11 17:49:17

+0

它不僅適用於帶有一個參數的構造函數:http:// liveworkspace。org/code/30a0gl%240 – chris 2013-03-11 17:52:59

1

顯式關鍵字僅對具有一個參數的構造函數有用。它將停止編譯器使用該構造函數進行轉換。我不知道你想通過明確你的+運算符來完成什麼。 :)

+1

小細節:如果其他參數具有默認值,即可以調用時只有一個參數,那麼顯式也可以用於具有多個參數的構造函數。 – ltjax 2013-03-11 17:42:21

+2

另外,除了轉換構造函數之外,還可以使轉換運算符變得明確。 – 2013-03-11 17:44:02

+0

@MooingDuck - 是的,但僅限於C++ 11。在C++ 03中,轉換操作符不能被標記爲顯式。 – 2013-03-11 19:13:04

0

如果你想要一個explicit轉換功能,你將不得不寫一個只爲這一目的(見here)(但只會有一個參數工作)。

至於你的operator+(...),只是刪除explicit它應該工作。

Compex c1(1,2); 
Compex c2(3,12); 
Compex c3 = c1 + c2; 
0

如果你想阻止類型使用operator +時隱式轉換爲compex,您可以利用模板參數的優勢。

模板參數不直接受制於類型轉換規則。

class compex{ 
    template<class C, 
      typename std::enable_if<std::is_same<C,complex>::value>::type > 
    compex& operator + (const C& P1) 
    { 
     // Your code 
    } 
};