There is no suitable function to call 'begin (int ** &)

I wrote a C ++ program as fllow (3.43.cpp):

#include <iostream>
using std::cout;
using std::endl;

void version_1(int **arr) {
    for (const int (&p)[4] : arr) {
        for (int q : p) {
            cout << q << " ";
        }
        cout << endl;
    }
}

int main() {
    int arr[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
    version_1(arr);
    return 0;
}

      

Then I will compile it with:, gcc my.cpp -std=c++11

there is an error that I cannot deal with. Information:

3.43.cpp:6:30: error: no matching function for call to β€˜begin(int**&)’
     for (const int (&p)[4] : arr) {
                              ^
3.43.cpp:6:30: note: candidates are:
In file included from /usr/include/c++/4.8.2/bits/basic_string.h:42:0,
                 from /usr/include/c++/4.8.2/string:52,
                 from /usr/include/c++/4.8.2/bits/locale_classes.h:40,
                 from /usr/include/c++/4.8.2/bits/ios_base.h:41,
                 from /usr/include/c++/4.8.2/ios:42,
                 from /usr/include/c++/4.8.2/ostream:38,
                 from /usr/include/c++/4.8.2/iostream:39,
                 from 3.43.cpp:1:
/usr/include/c++/4.8.2/initializer_list:89:5: note: template<class _Tp> constexpr const _Tp* std::begin(std::initializer_list<_Tp>)
     begin(initializer_list<_Tp> __ils) noexcept

      

I search for it on google but didn't find a similar answer.

+3


source to share


3 answers


Since it arr

is just a pointer, there is no way to tell how big it is. But, since you are actually traversing in a real array, you can simply template your function by your dimensions so that you can take the actual array by reference and not decay to a pointer:



template <size_t X, size_t Y>
void foo(const int (&arr)[X][Y])
{
    std::cout << "Dimensions are: " << X << "x" << Y << std::endl;

    for (const int (&row)[Y] : arr) {
        for (int val : row) {
            std::cout << val << ' ';
        }
        std::cout << std::endl;
    }
}

int main() {
    int arr[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
    foo(arr);
}

      

+11


source


std::begin()

and std::end()

won't work for pointers. They only work for arrays. If you want to output the size of your array, you need to pass it as a reference to your function:



#include <cstddef>
template <std::size_t A, std::size_t B>
void version_1(int (&arr)[B][A]) {
    for (const int (&p)[A] : arr) {
        for (int q : p) {
            cout << q << " ";
        }
        cout << '\n';
    }
}

      

+2


source


Pointers are not the same as arrays. To be able to use range based, your container must support std::begin

and std::end

. Standard C arrays can be used, but not pointers.

+1


source







All Articles