Неправильное разрешение имен, когда родительский и внутренний класс имеют одно и то же имя

У меня есть нечетный случай с Visual Studio 2003. Для некоторых законных причин у меня есть следующая иерархия:

class A {};

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

class C : public B::A {};

То есть, у меня есть внутренний класс с тем же именем, что и родительский элемент внешнего класса. Когда C пытается наследовать от B::A, Visual Studio считает, что я указываю на родительский класс A, а не на вложенный класс внутри B. Кажется, что GCC разрешает внутреннюю версию класса, как я ожидал

Является ли это ошибкой Visual Studio 2003, или я делаю это неправильно? Есть ли способ обхода (кроме обновления Visual Studio)?

Ответ 1

Да, это похоже на ошибку 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;
}

Ответ 2

Это выглядит как ошибка в Visual С++ 2003. Используя Visual С++ 2012, B::A правильно называет вложенный класс A, а не базовый класс A.

Ответ 3

Похоже на ошибку VS,
Я не знал Спасибо за публикацию.
Я думаю, что обходным путем будет SafeInherit Template. Я не знаю, что будет лучшим именем.

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

class B : public SafeInherit<A>::Type {
  public:
  class A {};
}