Я пытаюсь перенести некоторый код, написанный для MSVC, для компиляции на Clang. Однако, похоже, что возникла проблема с поиском некоторых шаблонных функций. Вот часть определения структуры, которая вызывает у меня проблемы:
template< typename T > struct FixedVector
{
T * ptr;
size_t count;
typedef T value_type;
FixedVector():ptr(0),count(0) {}
~FixedVector()
{
DeleteArr(ptr); // Error message appears here
count=0;
}
// ...
}
DeleteArr(ptr)
Функция относится к функции, определенной позже, например:
template< typename T > inline void DeleteArr( T *& ptr )
{
delete[] ptr;
ptr = NULL;
}
Это сообщение об ошибке, которое я получаю в указанной строке:
error: call to function 'DeleteArr' that is neither visible in the template definition nor found by argument-dependent lookup
Глядя на полный раскрывающийся список с ошибкой (в XCode), следующее сообщение находится внизу списка:
'DeleteArr' should be declared prior to the call site or in an associated namespace of one of its arguments.
Нажатие на это сообщение приводит меня к определению функции DeleteArr (), как показано выше.
Это, очевидно, прекрасно скомпилировано в MSVC, и, глядя на различия между Clang и MSVC, это связано с причудой в MSVC, которая не требует, чтобы такие функции были определены до их использования, если есть определение где-то. Поэтому я посмотрел это сообщение об ошибке в Clang документация (соответствующая часть находится под заголовком «Неквалифицированный поиск в шаблонах»), и она предложила добавить предварительную декларацию перед определением шаблона. Поэтому я добавил это выше определение для FixedVector
:
template< typename T > inline void DeleteArr( T *& ptr );
Однако это сообщение об ошибке все еще появляется, и этот последний бит сообщения об ошибке (бит «должен быть объявлен до места вызова») все еще указывает на фактическое определение функции. Кто-нибудь знает в чем может быть проблема? У меня нет идей о том, как это действует на MSVC. Кроме того, поскольку сообщение об ошибке может найти определение функции, почему оно говорит, что не может быть найдено?
ОБНОВЛЕНИЕ: по совету комментариев я добавил реализацию DeleteArr () туда, где я объявил ее выше шаблона. Кажется, это приводит к той же ошибке! Я действительно в тупике сейчас.
Декларация DeleteArr
должен быть доступен для FixedVector
то есть определение первого должно предшествовать использованию последним. Это, вероятно, связано с неспособностью MSVC правильно реализовать двухфазный поиск.
сначала определите DeleteArr
template< typename T > inline void DeleteArr( T *& ptr )
{
delete[] ptr;
ptr = NULL;
}
Затем определите fixedvector
template< typename T > struct FixedVector
{
T * ptr;
size_t count;
typedef T value_type;
FixedVector():ptr(0),count(0) {}
~FixedVector()
{
DeleteArr(ptr); // Error message appears here
count=0;
}
// ...
}