trop d'initialiseurs de 'int [0]' c++
Première:
int k[] ={1,2,3,4,5};
Deuxième:
struct slk
{
int k[] ={1,2,3,4,5};
};
pour ces deux états, pourquoi le premier col de la compilation, mais la deuxième me donner
erreur:trop de initialiseurs de 'int [0]'. la compilation se serait passé si je l'ai mis k[5];
Que ce message d'erreur signifie? Remarque: le code testé sur GNU version de GCC 4.7.2
- Inline initialisation pour les membres est d'un tout autre jeu de balle. Prendre l'équivalent direct de votre premier échantillon, vous êtes censé pour initialiser les membres dans une liste d'initialisation de membre (si il y a un nombre limité de cas où vous pouvez le faire inline comme vous l'avez fait dans votre deuxième échantillon).
- Il semble fonctionner avec
int k[5] = {1,2,3,4,5};
mais je ne peux pas expliquer pourquoi. - C'est plus un "il doit avoir une taille à le faire dans une classe de chose". IIRC, le standard a une règle explicite.
Vous devez vous connecter pour publier un commentaire.
En C++11,-membre de la classe des initialiseurs sont autorisés, mais sont en fait la même que l'initialisation d'un membre de la liste d'initialisation. Par conséquent, la taille du tableau doit être explicitement mentionné.
Stroustrup a une courte explication sur son site ici.
Le message d'erreur signifie que vous accordez trop d'éléments pour un tableau de longueur 0, ce qui est le
int []
renvoie dans ce contexte.Dans le premier exemple, quelque chose de réel allocation de mémoire) qui se passe réellement. L'ordinateur facilement compte le nombre d'éléments et l'utilise comme la capacité. Dans la deuxième utilisation, dans le cadre d'une struct, le tableau est tout simplement partie du modèle d'une struct. Dans le second cas, la taille doit être explicitement donnée et connue à la compilation. Il n'y a pas de comptage automatique ici. C'est dans une veine similaire à la fonction déclarations contre les définitions ainsi que les déclarations de variables (dit de type, mais la mémoire est intacte) et leur invocation/utilisation (si le programme actes).
Probablement entraîner dans un
struct
le compilateur a besoin de vous pour spécifier la taille explicitement.C initialiser au sein de la structure (pun intended)
Ce sont deux totalement différents contextes:
La première est une déclaration de variable (avec une initialiser la clause).
La seconde est une définition de type.