2013-07-25 37 views
5
#include <iostream> 
#include <iterator> 
using namespace std; 
void print(int ia[]) 
{ 
    int *p = begin(ia); 
    while(p != end(ia)) 
     cout<<*p++<<'\t'; 
} 

int main() 
{ 
    int ia[] = {1,2,3,4},i; 
    print(ia); 

    return 0; 
} 

P con trỏ đến phần tử đầu tiên trong ia. tại sao nó nói "lỗi: không có chức năng phù hợp cho cuộc gọi đến 'bắt đầu (int * &)' C++"! nhờ :): không có chức năng phù hợp cho cuộc gọi đến 'bắt đầu (int * &)' C++

+2

@KarthikT: Nó sẽ làm cho có sự khác biệt. Gọi 'bắt đầu' trên một con trỏ sẽ không bao giờ hoạt động. –

+0

@EdS. ah có .. tại sao tôi không thấy rằng .. –

Trả lời

10

Bởi vì bên trong print(), biến ia là một con trỏ, không phải là một mảng. Bạn không nên gọi số begin() trên con trỏ.

+0

Tôi đã nhận nó! Cảm ơn u rất nhiều! :) – Aleeee

4

Bạn đang sử dụng các chức năng miễn phí beginend miễn phí trên con trỏ, điều này không được phép.

Bạn có thể làm điều gì đó tương tự với C++ 11 của intializer_list

//g++ -std=c++0x test.cpp -o test 
#include <iostream> 
#include <iterator> 
using namespace std; 
void print(initializer_list<int> ia) 
{ 
    auto p = begin(ia); 
    while(p != end(ia)) 
     cout<<*p++<<'\t'; 
} 

int main() 
{ 
    print({1,2,3,4}); 
    return 0; 
} 
+1

Tôi cũng khuyên bạn nên sử dụng dựa trên phạm vi cho. – soon

+0

Cảm ơn u! :) Đây là một cách hay! – Aleeee

+0

Điều này liên quan đến hiệu suất như thế nào? – Jakobovski

2

Như những người khác chỉ ra, mảng của bạn được phân rã đến một con trỏ. Mục nát là vật lịch sử từ C. Để làm những gì bạn muốn, vượt qua mảng như tài liệu tham khảo và suy ra kích thước mảng:

template<size_t N> 
void print(int (&ia[N]) 
{ 
    int *p = begin(ia); 
    while(p != end(ia)) 
     cout<<*p++<<'\t'; 
} 

... 

print(ia); 
+0

Cảm ơn bạn! :) Bạn là một người đàn ông tốt! – Aleeee

Các vấn đề liên quan