2017-08-09 21 views
0

私はこの列挙型を持っており、その列挙型のオブジェクトを1つだけ増やしたいだけです。列挙型の演算子のオーバーロード

enum Month { 
    january = 1, 
    february, 
    march, 
    april, 
    may, 
    june, 
    july, 
    august, 
    september, 
    october, 
    november, 
    december 
}; 

私の列挙体の月mのオブジェクトでは、オブジェクトの変数を1つの位置だけ移動したいだけです。それは、引数としてint型を取る必要があることをパラメータとして月&メートルで

Month operator++(Month &m) { 
     m = static_cast<Month>(m + 1); 
     return m; 
    } 

私はエラーを取得します。だからもし私が "(Month & m、int)"と言うと、 "それは0か1つの引数を取らなければならない"と言われています。演算子のオーバーロードがメンバ関数である場合は、Month & mを必要としないと読んだので、削除しました。その後、私はさらに別のエラーが発生します。「演算子++(オペランドの型は 'Month')」と一致しません。私が紛失しているものはありますか?

メインコード:コメントで

class Date { 
    int y, d, month_end; // private 
    Month m; 

    public: 
     Date(int yy, Month mm, int dd) 
     : y(yy), d(dd), m(mm) { 
     } 

     Month& operator++(Month &m) { 
      m = static_cast<Month>(m + 1); 
      return m; 
     } 

     void add_month() { 
      ++m; 
     } 
+0

どのコンパイラを使用していますか? MS vs14でうまく動作します。 'Main()'を表示してください。 – lakeweb

+0

@lakeweb gcc version 6.4.0 20170704(Debian 6.4.0-1)私は実際にオペレータのオーバーロードを使ってmainで何も呼び出さなかったが、元の質問に追加する。 –

+0

@ sS5H lakewebのコメントの意味は、あなたが[最小限で完全で検証可能な例](https://stackoverflow.com/help/mcve)を作成するためのものだと思います。 – jodag

答えて

1

は、あなたが言った:

Is there something I'm overlooking? http://ideone.com/uOkSk0

はい。あなたは、特別な場所で関数を定義しています - Dateの定義内です。非メンバ関数である必要があります。

using namespace std;

enum Month { 
    january = 1, 
    february, 
    march, 
    april, 
    may, 
    june, 
    july, 
    august, 
    september, 
    october, 
    november, 
    december 
}; 

Month& operator++(Month &m) { 
    m = static_cast<Month>(m + 1); 
    return m; 
} 

class Date { 
    int y, d; 
    Month m; 

    public: 
    Date(int yy, Month mm, int dd) // constructor 
     : y(yy), d(dd), m(mm) { // member initializer 
     } 


    void add_month() { 
     ++m; 
    } 
}; 

int main() 
{ 
    Month m = january; 
    ++m; 
+0

ニースキャッチ、そしてなぜそれが私のために働いたのですか? – lakeweb

+0

@ lakeweb、OPがideone.comでMCVEを投稿した後は、エラーを見やすくなりました。私たちはMCVEの重要性を過度に強調することはできません。 –

関連する問題