2010-05-21 5 views
1

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

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

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

где BinarySearch является метод наследуется от другого шаблона.

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

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

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

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

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 как оператор «Меньше» по какой-либо причине.

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

-D

ответ

0

Если 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

Да! «this->» работает и по той причине, которую вы объясняете, является более очевидным выбором. DOH! Спасибо! –

0

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

Предлагаю найти, как uint32 определен в Windows, и попытаться скопировать это определение.

-1

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

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

+0

Второе недействительно, поскольку оно интерпретируется как токен переключения. Вот почему пространство есть, что заставляет его интерпретироваться как два последовательных '' 'токена. –

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