基本的には、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++の標準では、このような場合にはどうにかしてクリーンなコーディングが可能になるはずです(実際はあまり複雑ではありません)。
、そして:これが可能であるかどうかは知りませんが、簡単な作業では周りの
Inner
の静的メソッドにフォールバックするだろう私はOuter'のプライベートメンバーですが、この列挙体をどのように使うことができるのか分かりません。あなたの質問は不明です。 –これは重複していません。私はいくつかの説明をしました。もう一度それを読んでください。 – DawidPi
@SamVarshavchikこれはスニペットです。 Innerクラスからのものは、Test型の値をインクリメントしたいかもしれません(他のメソッドがあり、実装ではType Testの変数に++を使用できます)。それはかなり明らかです... – DawidPi