10

Visual Studio 2003 の奇妙なケースがあります。ある程度正当な理由から、次の階層があります。

class A {};

class B : public A {
public:
    class A {};
};

class C : public B::A {};

つまり、外部クラスの親と同じ名前の内部クラスがあります。Cから継承しようとすると、 Visual Studio は、 内のネストされたクラスではなく、B::A親クラスを指していると見なします。予想通り、GCCは内部クラスのバージョンに解決されるようですAB

これは Visual Studio 2003 のバグですか、それとも間違っていますか? 回避策はありますか (Visual Studio のアップグレード以外)?

4

3 に答える 3

5

これは、Visual C++ 2003 のバグのようです。Visual C++ 2012 を使用すると、基本クラスではなく、B::Aネストされたクラスに正しく名前が付けられます。AA

于 2012-08-17T16:35:09.620 に答える
2

はい、これはVS2003のバグのようです。回避策は簡単です-typedefを使用すると、次のように機能します。

class A { public: int x; };
class B : public A { public: class A { public: int y; }; }; 

typedef B::A BA;

class C: public BA {};

void f()
{
   C cc;
   cc.y = 0;
}
于 2012-08-17T16:46:16.973 に答える
0

VSのバグのよう
です。投稿してくれてありがとう。
回避策はテンプレートになると思いますSafeInherit。より良い名前が何になるかわかりません。

template <typename T>
struct SafeInherit{
  typedef T Type;
};

class B : public SafeInherit<A>::Type {
  public:
  class A {};
}
于 2012-08-17T16:45:19.340 に答える