2010-04-22 27 views
14

Sto cercando di capire lo boost array. Il code può essere letto facilmente dal sito dell'autore.Come dovrei inizializzare un boost :: array?

Nella motivazione del progetto, l'autore (Nicolai M. Josuttis) ha affermato che sono possibili i seguenti due tipi di inizializzazione.

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

Nel mio esperimento con g ++ (versione 4.1.2) Linea 1 funziona, ma la linea 2 non è. (linea 2 si ottiene il seguente:

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

)

Tuttavia, la mia domanda principale è, come Linea 1 sta lavorando? Ho cercato di scrivere una classe simile a array.hpp e utilizzare un'istruzione come linea 1, ma che non ha funzionato :-(. L'errore è

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>&) 

qualcuno può spiegare? C'è qualche cosa specifica spinta accadendo in linea 1 che ho bisogno di essere a conoscenza?

+0

Come Potatoswatter menziona questo funziona solo per POD tipi. Tuttavia, probabilmente vale la pena notare che la prossima specifica C++ 0x fornisce modi per supportare gli elenchi di inizializzazione con tipi non pod. –

+3

probabilmente hai campi costruttore o privato nella tua classe – Anycorn

+0

+ 1 @aaa: Grazie mille. Sì, il mio array (i dati) era privato nella mia classe. – Arun

risposta

20

questo è un elenco di inizializzazione tutore regolare:

matrice Boost è definito così:

struct array { T elems[N]; }; 

tutore interna è per l'inizializzazione elems matrice, tutore outear è per l'inizializzazione struct. Se si fornisce il proprio costruttore, non hai più semplice vecchio tipo di dati qualsiasi, non in grado di inizializzare tramite tutore

notare che si può andare senza tutore esterno, ma si otterrà un messaggio di avviso

+0

+1: Grazie per la spiegazione del rinforzo interno e del rinforzo esterno. – Arun

+0

Accetto questo perché questa risposta, insieme al commento dello stesso autore contro la domanda, mi ha davvero aiutato a risolvere il mio problema. – Arun

9

la sezione del standard è §8.5.1, aggregati.

  1. un aggregato è una matrice o una classe (clausola 9) senza costruttori dichiarati dall'utente (12.1), non privati ​​o membri di dati non statici protetti (clausola 11), nessuna classe di base (clausola 10) e nessuna funzione virtuale (10.3).
  2. Quando un aggregato viene inizializzato l'inizializzatore può contenere un inizializzatore clausola costituito da un brace- chiusa, elenco separato da virgole di inizializzazione-clausole per i membri dell'aggregato, scritto in aumentare pedice o membro ordine . Se l'aggregato contiene i sottogruppi , questa regola si applica in modo ricorsivo allo ai membri del sottoaggregato.

GCC 4.1.2 può essere violato il paragrafo 11.

11 Bretelle può essere eliso in un inizializzazione-list come segue. Se l'elenco di inizializzazione inizia con una parentesi graffa aperta , il successivo elenco di inizializzatori separati da virgola inizializza i membri di un sottoaggregato ; è errato per che ci siano più inizializzatori dei membri . Se, tuttavia, il inizializzatore-list per un subaggregate non inizia con una parentesi graffa sinistra, poi sufficiente solo inizializzatori dall'elenco sono prese per inizializzare i membri della subaggregate; eventuali rimanenti inizializzatori vengono lasciati per inizializzare il membro successivo dell'aggregato di che il sottoaggregato corrente è un membro .

+0

+1: Grazie per la citazione pertinente. – Arun

Problemi correlati