Неправильное разрешение имен, когда родительский и внутренний класс имеют одно и то же имя
У меня есть нечетный случай с 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 {};
}