2016-10-10 3 views
0

基本的には、OuterクラスのプライベートメンバーであるInnerクラスのプライベートメンバーであるTest enumのoperator ++を定義することができます。このスニペットは、私がacchieveしたいものを理解するのに役立つかもしれない:演算子++はネストされたプライベート列挙型です - コンパイラは正しいですか?

class Outer{ 
    class Inner{ 
     enum Test{ONE, TWO, THREE}; 
    }; 
}; 

const Outer::Inner::Test& operator++(Outer::Inner::Test& test){ 
    int rawTest = test; 
    test = static_cast<Outer::Inner::Test>(++rawTest); 
    return test; 
} 

は、残念ながら、上記のテストは、私は、次の試してみましたので、次のプライベートメンバであることを、エラーでコンパイルされません。

#include <iostream> 
using namespace std; 
class Outer{ 
    class Inner{ 
     enum Test{ONE, TWO, THREE}; 

     friend const Test& operator++(Test& test); 
    }; 

    friend const Inner::Test& operator++(Inner::Test& test); 
}; 

const Outer::Inner::Test& operator++(Outer::Inner::Test& test){ 
    int rawTest = test; 
    test = static_cast<Outer::Inner::Test>(++rawTest); 
    return test; 
} 

これはまだありませんTestはプライベートなInnerクラスで定義されているので、うまくいきません。私はOuterクラスのTest enumにアクセスしたくありませんが、両方のクラスを一緒に友達にする必要があります。内部クラス)

もちろんIcこのようなメイク機能をインライン:

#include <iostream> 
using namespace std; 
class Outer{ 
    class Inner{ 
     enum Test{ONE, TWO, THREE}; 

     friend const Test& operator++(Test& test){ 
      int rawTest = test; 
      test = static_cast<Outer::Inner::Test>(++rawTest); 
      return test; 
     } 
    }; 

}; 

、しかし、のは、私が.cppファイルにしたいいくつかの魔法の追加のロジックを、言わせてのために、私は、これを望んでいない可能性があります。 Test enumで演算子を使用できるようにoperator ++を正しく宣言する必要がありますか?

EDIT: これは、ネストされたクラスの指定されたenumに対して演算子++を単純に宣言したいので、これは確かに所定の質問の重複ではありません。提供される重複した質問は、Outerクラス関数からInnerクラスのメンバにアクセスすることです。

EDIT:ここホルトさんのコメント持ち込み :。 は、「実は、打ち鳴らすには(2つのfriend宣言で)2番目のコードを受け入れ、標準的な方法になり、これが打ち鳴らす拡張子または私はしないでくださいグラム++バグがあるかどうか知っておいてください...あなたの質問を再調整して、そこの言語弁護士の注意を喚起してください;) "もっと適切な質問は、正しいかどうか、gccとmsvc(私が試した)私の意見では、C++の標準では、このような場合にはどうにかしてクリーンなコーディングが可能になるはずです(実際はあまり複雑ではありません)。

+0

、そして:これが可能であるかどうかは知りませんが、簡単な作業では周りのInnerの静的メソッドにフォールバックするだろう私はOuter'のプライベートメンバーですが、この列挙体をどのように使うことができるのか分かりません。あなたの質問は不明です。 –

+0

これは重複していません。私はいくつかの説明をしました。もう一度それを読んでください。 – DawidPi

+0

@SamVarshavchikこれはスニペットです。 Innerクラスからのものは、Test型の値をインクリメントしたいかもしれません(他のメソッドがあり、実装ではType Testの変数に++を使用できます)。それはかなり明らかです... – DawidPi

答えて

2

宣言したいものは、TestへのアクセスのためにOuter::Inner内でのみ使用される「グローバル」関数(operator++)です。 Inner`は `` Test`がInner` `のプライベートメンバがあるので

#include <iostream> 

class Outer{ 
    class Inner{ 
     enum Test{ONE, TWO, THREE}; 

     static Test& pre_inc(Test&); 
     friend Test& operator++(Test& test) { 
      return pre_inc(test); 
     } 
    }; 
}; 

auto Outer::Inner::pre_inc(Test& test) -> Test& { 
    int rawTest = test; 
    test = static_cast<Test>(++rawTest); 
    return test; 
} 
+0

C++がこれを許可しないと私には奇妙なことになります。しかし、まだ、あなたの答えをありがとう:) – DawidPi

関連する問題