2014-12-30 2 views
0

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

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

+0

Что вы пытаетесь использовать 'using' (или, что то же,' typedef')? – Potatoswatter

ответ

3

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

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) - это немного боль, потому что класс, закодированный в соответствии с его пространством имен, нуждается в модификации, если он перемещен в другое пространство имен. Как вы уже сказали, немного уродливый.

+0

Нет перестановки 2), похоже, работает, но почему-то я забыл о typedefs, который будет более или менее исправлять мою проблему. Спасибо! –

+0

@HenrySwanson Хмм, [GCC] (http://coliru.stacked-crooked.com/a/306b81401a5b46bd) принимает декларацию, но Clang не делает, что похоже на ошибку. Однако GCC по-прежнему [не делает] (http://coliru.stacked-crooked.com/a/3b2cf5115e59aeac) интерпретирует такое заявление как разрешение двусмысленности, что является еще одной ошибкой. – Potatoswatter

1

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

+0

Это похоже на ту же проблему; это просто отличие того пространства имен, в котором он находится. Мне нравится, когда я могу использовать 'что-то :: Move' в моих .cpp-файлах, поэтому такие вещи, как' std :: list 'стать' list ', который является более читаемым, ИМО. –

+0

Я не понимаю: если ваш код находится в 'namespace something', тогда вы можете сказать' list 'без' использования'. –

+0

Я могу, но он по-прежнему ошибочно принимает «Переместить» класс для метода «Переместить». –

Смежные вопросы