Получение длины массива. Ошибки компилятора.

Я пробовал:

template <typename T,unsigned S> 
unsigned getArraySize(const T (&v)[S]) { return S; } 

после ответа Мотти qaru.site/info/20630/...

но у меня есть это сообщение:

ошибка C2265: '': ссылка на массив нулевого размера является незаконным

Что случилось с моим компилятором?

Я посмотрел эту страницу: http://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/4b78bcef-4c33-42f1-a4c5-fb6f702ced0b/vs6-c-compile-error-using-getaddrinfo поэтому я попробовал это решение:

template <typename T,unsigned S> 
unsigned getArraySize(const T v[S]) { return S; } 

это компилируется, но когда я пытаюсь его использовать:

double myX[2] = {7,3};
std::cout << getArraySize(myX) << std::endl; 

Я получаю ошибку компиляции:
ошибка C2783: 'unsigned int __cdecl getArraySize (const T [])': не удалось вывести аргумент шаблона для 'S'

Помимо изменения компилятора, есть ли способ обхода, который я могу использовать для получения размера массива?

Ответ 1

Это может быть ограничение VC6, вы пробовали другие компиляторы?

Ответ 2

но у меня есть это сообщение:

ошибка C2265: '': ссылка на массив нулевого размера является незаконным

Массивы с нулевым размером являются незаконными в С++.
Таким образом, это, вероятно, означает, что вы попытались с массивом нулевого размера.

это компилируется, но когда я пытаюсь его использовать:

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

template < typename T, unsigned S >
unsigned getArraySize (const T v [S]) {return S; }

Это не удается, потому что вам не разрешено передавать массивы в качестве параметров (вы можете передавать только ссылки на массивы).