Wrong name resolution when parent and inner class have the same name
Asked Answered
W

3

10

I have an odd case with Visual Studio 2003. For somewhat legitimate reasons, I have the following hierarchy:

class A {};

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

class C : public B::A {};

That is, I have an inner class with the same name as a parent of the outer class. When C tries to inherit from B::A, Visual Studio thinks I'm pointing to the parent class A, not the nested class within B. GCC seems to resolve to the inner class version as I expected

Is this a Visual Studio 2003 bug, or am I doing it wrong? Is there a workaround (other than upgrading Visual Studio)?

Wingding answered 17/8, 2012 at 16:27 Comment(2)
Visual C++ 2003 was released nine years ago. It would be advisable to upgrade for a great many reasons.Wainscot
@JamesMcNellis If I were in charge of these things we would have upgraded a long time ago, but sadly I'm notWingding
C
2

Yes, this looks like VS2003 bug. Workaround is simple - use typedef, it works this way:

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;
}
Chenee answered 17/8, 2012 at 16:46 Comment(0)
W
5

This looks like a bug in Visual C++ 2003. Using Visual C++ 2012, B::A correctly names the nested class A, not the base class A.

Wainscot answered 17/8, 2012 at 16:35 Comment(2)
As for a workaround, I don't know: the design is rather questionable. I would rename the nested class. If I had Visual C++ 2003 installed I'd try to see what's up, but I haven't used Visual C++ 2003 in a few years.Wainscot
I was stupid and didn't test my simplified example; turns out it was wrong. The updated one reproduces the problemWingding
C
2

Yes, this looks like VS2003 bug. Workaround is simple - use typedef, it works this way:

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;
}
Chenee answered 17/8, 2012 at 16:46 Comment(0)
S
0

It looks like a VS bug,
I didn't know Thanks for posting.
I think The workaround will be a SafeInherit Template I don't know what will be a better name.

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

class B : public SafeInherit<A>::Type {
  public:
  class A {};
}
Singh answered 17/8, 2012 at 16:45 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.