2013-04-26 26 views
5

Tôi có một số người dùng được xác định vòng lặp, và tất cả bây giờ và sau đó tôi nhận được một lỗi lạ mà rất dễ dàng để làm việc xung quanh, nhưng tôi không hiểu tại sao tôi nhận được nó:Tại sao địa chỉ của phần tử mảng đôi khi bị nhầm lẫn với một tuyên bố?

uint8_t bytes[pitch*height]; 

array_iterator::col_iterator a(&bytes[0]); 

array_iterator::row_iterator base_iter_begin(
    array_iterator::col_iterator(&bytes[0]), width, pitch); 

array_iterator::row_iterator base_iter_end(
    array_iterator::col_iterator(&bytes[pitch*height]), width, pitch 
); 

Tôi có một lớp được gọi là array_iterator với row_iterator typedefs và col_iterator được nhúng. Phương thức khởi tạo row_iterator lấy một col_iterator làm đối số đầu tiên của nó. Câu lệnh đầu tiên và cuối cùng hoạt động tốt. Báo cáo kết quả giữa thất bại trong việc biên dịch với các lỗi sau:

test-2d-iterators.cc:780: error: declaration of 'bytes' as array of references 

Viết & (byte [0]) không giải quyết vấn đề (không đáng ngạc nhiên, vì [] có độ ưu tiên cao hơn &). Tất nhiên, tôi chỉ có thể thay thế "a" cho lệnh gọi hàm dựng col_iterator rõ ràng, nhưng tại sao tôi phải thực hiện? Và nếu có một vấn đề, tại sao trình tạo col_iterator trong dòng biên dịch cuối cùng?

Cảm ơn.

+2

Hầu hết các phân tích cú pháp có thể? –

+1

Đăng một ví dụ * ngắn * để khắc phục sự cố. –

+0

Nó có thể là Parse Vexing nhất, nhưng tôi không chắc chắn. Không phải dòng thứ ba sẽ phân tích theo cùng một cách? static_cast (& bytes [0]) giải quyết vấn đề, nhưng chỉ cần thêm parens xung quanh & byte [0] thì không. Xin lỗi ví dụ không phải là chưng cất nhiều hơn, nhưng vấn đề dường như đến và đi với không có vần điệu hoặc lý do (tức là, làm thế nào là dòng thứ ba khác nhau từ thứ hai?), Vì vậy, nó đã chống lại những nỗ lực của tôi. Nó chắc chắn trông giống như một lỗi phân tích cú pháp, mặc dù, vì vậy tôi sẽ nghĩ rằng nó không phụ thuộc vào những gì row_iterator hoặc col_iterator thực sự là. – user1806566

Trả lời

2

Trước hết, chúng ta có thể thu hẹp vấn đề của bạn để những dòng sau:

struct row_iterator { ... }; 
typedef unsigned* col_iterator; 
unsigned bytes[5]; 
row_iterator base_iter_begin(col_iterator(&bytes[0])); 

Và dòng thứ ba được hiểu là:

row_iterator base_iter_begin(col_iterator& bytes[0]); 

Và đó một dòng khai báo một chức năng dùng như tham số một mảng của 0 tham chiếu đến col_iterator và trả về một int. Nó thực sự là một trường hợp của most vexing parse như chỉ ra trong các ý kiến.

Cách đơn giản nhất để thoát khỏi nó là sử dụng bản sao khởi tạo thay vì khởi tạo trực tiếp (khởi trong C++):

row_iterator base_iter_begin = row_iterator(col_iterator(&bytes[0])); 

Mà trong trường hợp của bạn sẽ là:

array_iterator::row_iterator base_iter_begin = array_iterator::row_iterator(array_iterator::col_iterator(&bytes[0]), width, pitch); 

LƯU Ý : Với điều kiện bạn đang sử dụng C++ 11, có even more initialization rules và bạn có thể sử dụng danh sách khởi tạo để loại bỏ cả bản mẫu và bản phân tích khó hiểu nhất:

array_iterator::row_iterator base_iter_begin{array_iterator::col_iterator(&bytes[0]), width, pitch}; 
Các vấn đề liên quan