2010-04-22 5 views
14

J'essaie de comprendre le boost array. Le code peut être lu facilement à partir du site de l'auteur. Dans la logique de conception, l'auteur (Nicolai M. Josuttis) a mentionné que les deux types d'initialisation suivants sont possibles.Comment initialiser un boost :: array?

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

Dans mon expérience avec g ++ (version 4.1.2), la ligne 1 fonctionne mais la ligne 2 ne l'est pas. (ligne 2 donne les éléments suivants:

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

)

Néanmoins, ma principale question est, comment la ligne 1 fonctionne? J'ai essayé d'écrire une classe similaire à array.hpp et utiliser déclaration comme la ligne 1, mais cela ne fonctionne pas :-(. L'erreur est

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

Quelqu'un peut me expliquer? Y at-il quelque chose de spécifique coup de pouce qui se passe dans ligne 1 que je dois être conscient de

+0

Comme Potatoswatter mentionne cela ne fonctionne que pour POD les types. Cependant, il est probablement intéressant de noter que la prochaine spécification C++ 0x fournit des moyens de prendre en charge les listes d'initialisation avec des types autres que pod. –

+3

vous avez probablement des champs constructeur ou privé dans votre classe – Anycorn

+0

+ 1 @aaa: Merci beaucoup. Oui, mon tableau (les données) était privé dans ma classe. – Arun

Répondre

20

ceci est une liste d'initialisation d'accolade régulière:

réseau de Boost est défini comme suit:

struct array { T elems[N]; }; 

entretoise intérieure est pour l'initialisation du réseau de elems, croisillon outear est pour l'initialisation du struct. Si vous fournissez votre propre constructeur, vous n'avez plus vieux type de données simple tout ne peut pas initialiser à l'aide croisillon

Notez que vous pouvez aller sans croisillon externe, mais vous obtiendrez un avertissement

+0

+1: Merci pour l'explication de l'orthèse intérieure et de l'orthèse extérieure. – Arun

+0

J'accepte ceci parce que cette réponse avec le commentaire du même auteur contre la question m'a vraiment aidé à résoudre mon problème. – Arun

9

? la section pertinente de la norme est §8.5.1, les agrégats.

  1. un agrégat est un tableau ou une classe (article 9) sans Constructeurs déclarés par l'utilisateur (12.1), non privé ou membres de données non statiques protégés (article 11), pas de classes de base (clause 10) et pas de fonctions virtuelles (10.3).
  2. Quand un agrégat est initialisé l'initialiseur peut contenir un initialiseur article constitué d'un brace- fermée, séparant par des virgules de clauses initialiseur-pour les membres de l'agrégat, écrit en l'ordre croissant de l'indice ou le membre . Si l'agrégat contient sous-agrégats, cette règle s'applique récursivement aux membres du sous-agrégat.

GCC 4.1.2 peut être enfreint le paragraphe 11.

11 Accolades peuvent être éludée dans un initialiseur-liste comme suit. Si la liste d'initialisation commence par une accolade gauche , la liste d'initialiseurs suivante, qui est séparée par des virgules, initialise les membres d'un sous-agrégat ; il est erroné pour qu'il y ait plus d'initialiseurs que de membres . Si, cependant, la liste d'initialisation pour un sous-agrégat ne commence pas par une accolade gauche, alors seulement les initialiseurs suffisants de la liste sont pris pour initialiser les membres de le sous-agrégat; les initialiseurs restants sont laissés pour initialiser le membre suivant de l'agrégat dont le sous-agrégat actuel est un membre .

+0

+1: Merci pour la citation pertinente. – Arun

Questions connexes