http://msdn.microsoft.com/en-us/library/9ekhdcxs(v=vs.80).aspxによると、
C2079は、前方宣言がスコープ内にあるタイプのスタックでオブジェクトを宣言しようとした場合にも発生する可能性があります。
class A; class B { A a; // C2079 }; class A {};
考えられる解決策:
class A; class C {}; class B { A * a; C c; }; class A {};
私の質問は、次のような状況でこのエラーをどのように排除するかです。
class A; // Object
class B // Container
{
public:
typedef int SomeTypedef;
private:
A a; // C2079
};
class A {
void Foo(B::SomeTypedef);
};
AはBのtypedefを使用する必要があるため、Bを宣言する前にAを宣言することはできません。また、このエラーのために、Aの前にBを宣言することはできません。
考えられる解決策の1つは、スタック変数の代わりにAへのポインターを使用することですが、ポインターは必要ありません(この場合)。
別の解決策は、typedefを使用しないか、クラスB内に配置しないことです。しかし、B :: SomeTypedefがSomeTypedefよりも適切な名前であるように、それがBに属し、プロジェクトの名前空間を汚染したくない場合はどうでしょうか。