2012-03-29 15 views
2

以下のコードを示しました。オーバーロードされた後置演算子をオーバーロードすると、コンパイラはエラーをスローします。オーバーロードされたプレフィックス演算子でうまく動作します。エラーオーバーロードされた後置インクリメント/デクリメント演算子のostream演算子のオーバーロード

error: no match for ‘operator<<’ in ‘std::cout << cDigit.Digit::operator++(0)’ 

コード

#include <iostream> 

using namespace std; 

class Digit 
{ 
private: 
    int m_nDigit; 
public: 
    Digit(int nDigit=0) 
    { 
     m_nDigit = nDigit; 
    } 

    Digit& operator++(); // prefix 
    Digit& operator--(); // prefix 

    Digit operator++(int); // postfix 
    Digit operator--(int); // postfix 

    friend ostream& operator<< (ostream &out, Digit &digit); 

    int GetDigit() const { return m_nDigit; } 
}; 

Digit& Digit::operator++() 
{ 
    // If our number is already at 9, wrap around to 0 
    if (m_nDigit == 9) 
     m_nDigit = 0; 
    // otherwise just increment to next number 
    else 
     ++m_nDigit; 

    return *this; 
} 

Digit& Digit::operator--() 
{ 
    // If our number is already at 0, wrap around to 9 
    if (m_nDigit == 0) 
     m_nDigit = 9; 
    // otherwise just decrement to next number 
    else 
     --m_nDigit; 

    return *this; 
} 

Digit Digit::operator++(int) 
{ 
    // Create a temporary variable with our current digit 
    Digit cResult(m_nDigit); 

    // Use prefix operator to increment this digit 
    ++(*this);    // apply operator 

    // return temporary result 
    return cResult;  // return saved state 
} 

Digit Digit::operator--(int) 
{ 
    // Create a temporary variable with our current digit 
    Digit cResult(m_nDigit); 

    // Use prefix operator to increment this digit 
    --(*this);    // apply operator 

    // return temporary result 
    return cResult;  // return saved state 
} 

ostream& operator<< (ostream &out, Digit &digit) 
{ 
    out << digit.m_nDigit; 
    return out; 
} 

int main() 
{ 
    Digit cDigit(5); 
    cout << ++cDigit << endl; // calls Digit::operator++(); 
    cout << --cDigit << endl; // calls Digit::operator--(); 
    cout << cDigit++ << endl; // calls Digit::operator++(int); //<- Error here?? 
return 0; 
} 

答えて

6

あなたoperator<< const参照によってそのDigitパラメータを取る必要があります:Digit::operator++(int)は一時オブジェクト、することはできません返すため

ostream& operator<< (ostream &out, const Digit &digit) 

これは、ここで必要とされています非const参照をとる関数に渡されます。

+0

+1よかったです!ほとんどのC++チュートリアルでは、演算子のオーバーロード中にそのことについて言及していないことに驚いています。 – enthusiasticgeek

+0

Hrm、もっと良いチュートリアルを書く必要があるかもしれません:-)あなたはそれを変更するつもりがなければ、それをconstにします。 – bstamour

+0

初心者/中級レベルのプログラマーには、 "sir/ma'amのようなエラーや提案で少し妥当ではないよりスマートなコンパイラが好きですか?const修飾子を忘れましたか?"不当な複雑さの何らかのかたまりではなく(幸運なことに、この場合はそうではない)。うまくいけば私たちは将来彼らを見るだろう。 :) – enthusiasticgeek