#cpp #массивы #указатели #шаблоны_с++ #итераторы
Пишу простую шаблонную функцию in_array. По замыслу, она должна работать с любыми типами. Вот код: templatebool 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. В чем моя ошибка?
Ответы
Ответ 1
Для указателей стандартные функции std::begin и std::end не определены. Имея указатель, в общем случае, нельзя определить, указывает ли он на одиночный объект или на первый объект некоторой последовательности объектов. В виду этого нельзя определить функцию std::end для указателей, так как неизвестно число элементов, которые могут адресоваться указателем. Вы могли бы свою функцию определить следующим образом templatebool 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; } включив в объявление функции еще один параметр, задающий число элементов в массиве. Ответ 2
Для указателя эти функции не определены.
Комментариев нет:
Отправить комментарий