Определение шаблона не может найти мою функцию

Я пытаюсь перенести некоторый код, написанный для 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 () туда, где я объявил ее выше шаблона. Кажется, это приводит к той же ошибке! Я действительно в тупике сейчас.

4

Решение

Декларация DeleteArr должен быть доступен для FixedVectorто есть определение первого должно предшествовать использованию последним. Это, вероятно, связано с неспособностью MSVC правильно реализовать двухфазный поиск.

5

Другие решения

сначала определите 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;
}
// ...
}
1