Страницы

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

вторник, 31 декабря 2019 г.

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

#cpp #массивы #указатели #шаблоны_с++ #итераторы


Пишу простую шаблонную функцию 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. В чем моя ошибка?
    


Ответы

Ответ 1



Для указателей стандартные функции 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; } включив в объявление функции еще один параметр, задающий число элементов в массиве.

Ответ 2



Для указателя эти функции не определены.

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

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