Вопрос

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

Оригинальный код внутри функции члена шаблона класса:

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

где двоичный поиск - это метод, унаследованный от другого шаблона.

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

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

Compiler Visual Studio Compiler, похоже, подходит вверх по иерархии шаблона, но 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

После некоторой головы царапин, я верю, что происходит вот то, что он пытается разрешить «<» перед бинарный поиск как оператора «меньше, чем».

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

Потрясающий

Это было полезно?

Решение

Если 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 или имя класса также сделает имя зависимый от, Таким образом, задерживая поиск досмотра досмотра. Эти два факта необходимы для его работы.

Другие советы

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

Я предлагаю искать, как UINT32 определяется в Windows и попробуйте копировать это определение.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top