2014-10-03 15 views
7

Khi tôi cố gắng biên dịch đoạn mã sau vào gcc 4.8.2, tôi nhận được lỗi sau:Phạm vi dựa cho vòng lặp trên mảng truyền cho chức năng phi chính

test.cc: In function ‘void foo(int*)’: 
test.cc:15:16: error: no matching function for call to ‘begin(int*&)’ 
    for (int i : bar) { 
       ^

Cùng với một bó trong khi những người khác từ sâu hơn trong thư viện mẫu.

#include <iostream> 
using namespace std; 

void foo(int*); 

int main() { 
    int bar[3] = {1,2,3}; 
    for (int i : bar) { 
    cout << i << endl; 
    } 
    foo(bar); 
} 

void foo(int* bar) { 
    for (int i : bar) { 
    cout << i << endl; 
    } 
} 

Nếu tôi xác định lại foo để sử dụng lập chỉ mục cho vòng lặp, thì mã sẽ biên dịch và hoạt động như mong đợi. Ngoài ra, nếu tôi di chuyển vòng lặp đầu ra dựa trên dải ô thành main, tôi cũng nhận được hành vi mong đợi.

Làm cách nào để chuyển mảng bar đến foo theo cách sao cho nó có khả năng thực hiện một vòng lặp dựa trên phạm vi trên đó?

Trả lời

13

Với số array decaying vào con trỏ, bạn đang mất một phần thông tin quan trọng: kích thước của nó.

Với một mảng tham chiếu đến phạm vi của bạn lặp dựa hoạt động:

void foo(int (&bar)[3]); 

int main() { 
    int bar[3] = {1,2,3}; 
    for (int i : bar) { 
    cout << i << endl; 
    } 
    foo(bar); 
} 

void foo(int (&bar)[3]) { 
    for (int i : bar) { 
    cout << i << endl; 
    } 
} 

hoặc, trong một thời trang generic (tức mà không chỉ định kích thước mảng trong chữ ký chức năng),

template <std::size_t array_size> 
void foo(int (&bar)[array_size]) { 
    for (int i : bar) { 
    cout << i << endl; 
    } 
} 

Try it out

1

Đối với mảng có kích thước cố định, bạn có thể

  • Chuyển mảng thô theo tham chiếu.

  • Chuyển số std::array bằng cách tham chiếu.

  • Vượt qua một số std::vector bằng cách tham chiếu.

Sự lựa chọn tự nhiên (đối với một mảng kích thước cố định) là std::array, ví dụ:

#include <iostream> 
#include <array> 
using namespace std; 

void foo(array<int, 3> const& bar) { 
    for (int i : bar) { 
    cout << i << endl; 
    } 
} 

int main() { 
    array<int,3> const bar = {1,2,3}; 
    for (int i : bar) { 
    cout << i << endl; 
    } 
    foo(bar); 
} 
Các vấn đề liên quan