2010-04-22 35 views
14

Tôi đang cố gắng hiểu số boost array. Các code có thể được đọc dễ dàng từ trang web của tác giả.Tôi nên khởi tạo tăng :: mảng như thế nào?

Trong lý do thiết kế, tác giả (Nicolai M. Josuttis) đã đề cập rằng hai kiểu khởi tạo sau đây là có thể.

boost::array<int,4> a = { { 1, 2, 3 } }; // Line 1 
boost::array<int,4> a = { 1, 2, 3 };  // Line 2 

Trong thử nghiệm của tôi với g ++ (phiên bản 4.1.2) Dòng 1 đang hoạt động nhưng Dòng 2 thì không. (Tuyến số 2 mang lại như sau:

warning: missing braces around initializer for 'int [4]' 
warning: missing initializer for member 'boost::array<int, 4ul>::elems' 

)

Tuy nhiên, câu hỏi chính của tôi là, làm thế nào Line 1 đang làm việc? Tôi cố gắng để viết một lớp học tương tự như array.hpp và sử dụng tuyên bố như Line 1, nhưng điều đó không làm việc :-(. Lỗi này là

typedef array< unsigned int, 10 > MyArray; 

MyArray b = { { 1, 2, 3 } }; // Line 74 

array_test.cpp:74: error: in C++98 'b' must be initialized by constructor, not by '{...}' 
array_test.cpp:74: error: no matching function for call to 'array<unsigned int, 10u>::array(<brace-enclosed initializer list>)' 
array.h:16: note: candidates are: array<unsigned int, 10u>::array() 
array.h:16: note:     array<unsigned int, 10u>::array(const array<unsigned int, 10u>&) 

Ai đó có thể giải thích cho tôi? Có một số điều tăng cụ thể xảy ra trong dòng 1 mà tôi cần phải nhận thức được?

+0

Như Potatoswatter đề cập đến điều này chỉ làm cho POD loại. Tuy nhiên, có thể đáng chú ý là thông số C++ 0x sắp tới cung cấp các cách hỗ trợ cho các danh sách khởi tạo với các kiểu không phải kiểu nhóm. –

+3

bạn có thể có hàm tạo hoặc trường riêng trong lớp của bạn – Anycorn

+0

+ 1 @aaa: Cảm ơn rất nhiều. Có, mảng của tôi (dữ liệu) là riêng tư trong lớp của tôi. – Arun

Trả lời

20

đây là một danh sách cú đúp khởi thường xuyên:

mảng Boost được định nghĩa như thế này:

struct array { T elems[N]; }; 

cú đúp bên trong là cho elems mảng khởi tạo, nẹp outear là dành cho struct khởi tạo. Nếu bạn cung cấp constructor của riêng bạn, bạn không còn phải datatype cũ đồng bằng bất kỳ không thể khởi tạo bằng cú đúp

thông báo mà bạn có thể đi mà không có cú đúp bên ngoài, nhưng bạn sẽ nhận được một cảnh báo

+0

+1: Cảm ơn sự giải thích của nẹp bên trong và nẹp ngoài. – Arun

+0

Tôi chấp nhận điều này vì câu trả lời này cùng với nhận xét của tác giả giống nhau về câu hỏi thực sự đã giúp tôi giải quyết vấn đề của mình. – Arun

9

các phần có liên quan của tiêu chuẩn là §8.5.1, uẩn.

  1. một tổng hợp là một mảng hoặc một lớp học (khoản 9) không có người khai báo do người dùng khai báo (12.1), không riêng tư hoặc thành viên dữ liệu phi tĩnh được bảo vệ (khoản 11), không có lớp cơ sở (khoản 10) và không có chức năng ảo (10.3).
  2. Khi một tổng thể được khởi tạo initializer có thể chứa một initializer-khoản bao gồm một kèm brace-, danh sách bằng dấu phẩy của initializer-khoản cho các thành viên của tổng hợp, viết bằng tăng subscript hoặc thành viên theo thứ tự . Nếu tổng hợp chứa các phân nhóm, quy tắc này áp dụng đệ quy cho các thành viên của phân nhóm.

GCC 4.1.2 chưa vi phạm đoạn 11.

11 Niềng răng có thể được elided trong một initializer-list như sau. Nếu danh sách khởi tạo bắt đầu bằng một cú đúp bên trái , thì danh sách khởi tạo được tách nhau bằng dấu phẩy khởi tạo các thành viên của số phân tách nhỏ hơn; nó là sai đối với có nhiều trình khởi tạo hơn thành viên. Tuy nhiên, nếu danh sách khởi tạo cho một phân nhóm không bắt đầu bằng dấu ngoặc nhọn, thì chỉ đủ trình khởi tạo từ danh sách được thực hiện để khởi tạo các thành viên của phân nhóm; bất kỳ bộ khởi tạo còn lại nào còn lại để khởi tạo thành viên tiếp theo của tổng hợp mà tổng số hiện tại là thành viên .

+0

+1: Cảm ơn báo giá có liên quan. – Arun

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