Name conflict between member function and class name

2.1k Views Asked by At

I'm writing a chess program with wxWidgets. At one point, I have a subclass of wxGLCanvas, and it makes use of a Move class I wrote. Unfortunately, it seems like there's a method wxWindowBase::Move(), and so all my statements of the form list<Move> li won't compile.

Is there any nice way to resolve this? I've tried list< ::Move> li, and that does fix the problem, but it's gross, and I have to make that change everywhere. Unlike with namespace conflicts, a using-declaration doesn't seem to help here.

2

There are 2 best solutions below

2
On BEST ANSWER

There are a few ways to disambiguate a base class hidden by a method name.

typedef Move::Move Move_Base; // 1. the LHS of :: operator ignores functions
using typename Move::Move; // 2. non-template "typename" avoids constructor
typedef class Move Move_Base; // 3. elaborated type specifier
typedef ::Move Move_Base; // 4. namespace qualification (as mentioned)

(1) may not work in GCC due to a bug. (Not sure; you can try and see.)

(2) is perhaps the most elegant, but the compiler has to get some C++11 nuances right. The typename keyword there is illegal in C++03, but I think it's not necessary. In C++11, the syntax refers to the constructor instead of the type name unless you say typename.

You'll need to qualify the inherited function as wxWindowBase::Move().

(3) only works when the base class is part of the current namespace, which often it shouldn't be.

(4) is a bit of a pain because a class hard-coded against its enclosing namespace needs modification if moved to another namespace. As you mentioned, a bit ugly.

6
On

Put your code into a namespace. Then your class will be something::Move and it won't conflict as easily.