Страницы

Поиск по вопросам

понедельник, 17 декабря 2018 г.

Не находит std::begin, std::end

Пишу простую шаблонную функцию in_array. По замыслу, она должна работать с любыми типами. Вот код:
template bool in_array(T needle, const T* haystack) { T *e = std::find(std::begin(haystack), std::end(haystack), needle); if (e != std::end(haystack)) return true; else return false; }
Получаю ошибки:
std::begin: не найдена соответствующая перегруженная функция
То же для std::end. В чем моя ошибка?


Ответ

Для указателей стандартные функции std::begin и std::end не определены.
Имея указатель, в общем случае, нельзя определить, указывает ли он на одиночный объект или на первый объект некоторой последовательности объектов. В виду этого нельзя определить функцию std::end для указателей, так как неизвестно число элементов, которые могут адресоваться указателем.
Вы могли бы свою функцию определить следующим образом
template bool in_array(T needle, T ( &haystack )[N] ) { auto e = std::find(std::begin(haystack), std::end(haystack), needle);
return e != std::end(haystack); }
Либо вы можете эту функцию определить как
template bool in_array(T needle, T *haystack, size_t n ) { auto e = std::find( haystack, haystack + n, needle);
return e != haystack + n; }
включив в объявление функции еще один параметр, задающий число элементов в массиве.

Комментариев нет:

Отправить комментарий