Я пишу шахматную программу с помощью wxWidgets. В какой-то момент у меня есть подкласс wxGLCanvas
и он использует Move
класс я написал. К сожалению, похоже, что есть метод wxWindowBase::Move()
и так все мои высказывания вида list<Move> li
не скомпилируется.
Есть ли хороший способ решить эту проблему? я пробовал list< ::Move> li
и это решает проблему, но это грубо, и я должен сделать это везде. В отличие от конфликтов пространства имен, объявление об использовании здесь не помогает.
Есть несколько способов устранить неоднозначность базового класса, скрытого по имени метода.
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) это немного болезненно, потому что класс, жестко закодированный в соответствии с его пространством имен, нуждается в модификации, если перемещен в другое пространство имен. Как вы упомянули, немного некрасиво.
Поместите ваш код в пространство имен. Тогда ваш класс будет something::Move
и это не будет конфликтовать так легко.