Cannot use .begin() or .end() on an array
52,140
Solution 1
Arrays have no member functions as they aren't a class type. This is what the error is saying.
You can use std::begin(arr)
and std::end(arr)
from the <iterator>
header instead. This also works with types that do have .begin()
and .end()
members, via overloading:
#include <array>
#include <vector>
#include <iterator>
int main()
{
int c_array[5] = {};
std::array<int, 5> cpp_array = {};
std::vector<int> cpp_dynarray(5);
auto c_array_begin = std::begin(c_array); // = c_array + 0
auto c_array_end = std::end(c_array); // = c_array + 5
auto cpp_array_begin = std::begin(cpp_array); // = cpp_array.begin()
auto cpp_array_end = std::end(cpp_array); // = cpp_array.end()
auto cpp_dynarray_begin = std::begin(cpp_dynarray); // = cpp_dynarray.begin()
auto cpp_dynarray_end = std::end(cpp_dynarray); // = cpp_dynarray.end()
}
Solution 2
For a standard fixed-length C array, you can just write
int c_array[] = {1,3,5,7,9}, acc = 0;
for (auto it : c_array) {
acc += it;
}
The compiler does the behind-the-scenes work, eliminating the need to create all those begin and end iterators.
Author by
Sal Rosa
Updated on March 01, 2020Comments
-
Sal Rosa about 4 years
The error reads:
request for member 'begin', 'end' in 'arr' which is non class type int[5], unable to deduce from expression error.
My code:
#include <iostream> using namespace std; int main() { int * mypointer; int arr[5] = {1,3,5,7,9}; mypointer = arr; for(auto it = arr.begin(); it != arr.end(); ++it) { cout<<*mypointer<<endl; mypointer++; } return 0; }