Ошибки компиляции шаблона на iPhone SDK 3.2 - PullRequest
1 голос
/ 21 мая 2010

Я портирую некоторый шаблонный код из Windows, и у меня возникают некоторые различия компилятора на iPhone 3.2 SDK.

Исходный код внутри функции-члена шаблона класса:

return BinarySearch<uint32, CSimpleKey<T> >(key);

где BinarySearch - метод, унаследованный от другого шаблона.

Это приводит к следующей ошибке:

csimplekeytable.h:131: error: no matching function for call to 'BinarySearch(NEngine::uint32&)'

Компилятор Visual Studio, похоже, отлично подходит к иерархии шаблонов, но gcc требуется, чтобы я полностью определил, откуда взялась функция (я убедился в этом, исправив те же проблемы с переменными-членами шаблона).

Так что теперь мне нужно изменить это на:

return CSimpleTable<CSimpleKey<T> >::BinarySearch<uint32, CSimpleKey<T> >(key);

Который сейчас выдает следующую ошибку:

csimplekeytable.h:132: error: expected primary-expression before ',' token
csimplekeytable.h:132: error: expected primary-expression before '>' token

После некоторого расчесывания головы, я думаю, что здесь происходит то, что по какой-то причине он пытается преобразовать '<' перед BinarySearch как оператор "Меньше чем". </p>

Итак, два вопроса: - Я на правильном пути с моей интерпретацией ошибки? - Как мне это исправить?

Ответы [ 3 ]

0 голосов
/ 21 мая 2010

Возможно, это из-за того, что вы сделали интервалы непоследовательными. Вы сделали CSimpleTable<CSimpleKey<T> >, а не CSimpleTable<CSimpleKey<T>>. Я считаю, что они оба должны быть действительными, но, возможно, есть ошибка синтаксического анализатора.

Редактировать: Вы также можете попробовать перейти по маршруту автоматического вывода типа аргумента и выбрать явную специализацию.

0 голосов
/ 21 мая 2010

Если CSimpleTable является базовым классом, вам нужно квалифицировать ваш вызов с этим именем базового класса или, альтернативно, с this. Но поскольку оба они зависят от параметров шаблона, компилятор не может найти, что означает имя BinarySearch. Это может быть статическая целочисленная константа, которую вы сравниваете с чем-то другим, или это может быть шаблон, для которого вы помещаете аргументы, заключенные в <...>. Вам нужно рассказать компилятору о последнем

/* the "::template" means: 'the name that follows is a template' */
return CSimpleTable<CSimpleKey<T> >::template BinarySearch<uint32, CSimpleKey<T> >(key);

Или с this

return this->template BinarySearch<uint32, CSimpleKey<T> >(key);

Причина квалификации заключается в том, что компилятор не ищет неквалифицированные имена в базовых классах, которые зависят от параметров шаблона (в вашем случае это T), поскольку привязка имени будет зависеть от того, является ли база класс имеет такое имя или нет, что считается неудачным. Для простого имени, такого как BinarySearch, кроме того, нет никаких указаний на то, что это имя зависит от параметра шаблона, поэтому стандарт требует, чтобы компиляторы не задерживали поиск имени до момента его создания. Таким образом, имя, даже если поиск в зависимых базах будет разрешен при создании экземпляра (а это не так), все равно не может быть найден.

Вы должны явно указать компилятору, чтобы он смотрел во вмещающем классе, квалифицируя его, и в этом случае компилятор будет включать зависимые базовые классы во время поиска при создании экземпляра. Префикс this или имя класса также делает имя зависимым , что задерживает его поиск до момента его создания. Эти два факта необходимы для его работы.

0 голосов
/ 21 мая 2010

Может быть, это просто проблема с uint32 typedef. Возможно, это не доступно в новой среде. В первом случае разрешение пространства имен выбирает NEngine :: uint32, во втором случае оно вообще ничего не выбирает (отсюда ошибка синтаксического анализа).

Я предлагаю поискать определение uint32 в Windows и попробовать скопировать это определение поверх.

...