Конфликт имени между функцией-членом и именем класса

Я пишу шахматную программу с помощью wxWidgets. В какой-то момент у меня есть подкласс wxGLCanvasи он использует Move класс я написал. К сожалению, похоже, что есть метод wxWindowBase::Move()и так все мои высказывания вида list<Move> li не скомпилируется.

Есть ли хороший способ решить эту проблему? я пробовал list< ::Move> liи это решает проблему, но это грубо, и я должен сделать это везде. В отличие от конфликтов пространства имен, объявление об использовании здесь не помогает.

0

Решение

Есть несколько способов устранить неоднозначность базового класса, скрытого по имени метода.

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) может не работать в GCC из-за ошибки. (Не уверен, вы можете попробовать и посмотреть.)

(2), пожалуй, самый элегантный, но компилятор должен правильно понять некоторые нюансы C ++ 11. typename ключевое слово там недопустимо в C ++ 03, но я думаю, что в этом нет необходимости. В C ++ 11 синтаксис ссылается на конструктор вместо имени типа, если вы не скажете typename,

Вам нужно будет квалифицировать унаследованную функцию как wxWindowBase::Move(),

(3) работает только тогда, когда базовый класс является частью текущего пространства имен, что часто не должно быть.

(4) это немного болезненно, потому что класс, жестко закодированный в соответствии с его пространством имен, нуждается в модификации, если перемещен в другое пространство имен. Как вы упомянули, немного некрасиво.

3

Другие решения

Поместите ваш код в пространство имен. Тогда ваш класс будет something::Move и это не будет конфликтовать так легко.

1

По вопросам рекламы [email protected]