Erreur C ++ GCC 4.3.2 sur le vecteur du tableau de caractères

Son problème est similaire à celui de ce bug

Question sur le stockage d’un tableau dans un std :: vector en C ++

mais pour une raison différente (voir ci-dessous).

Pour l’exemple de programme suivant en C ++:

#include  int main(int c_, char ** v_) { const int LENGTH = 100; std::vector ca_vector; return 0; } 

GCC 4.2.3 comstack proprement. GCC 4.3.2 émet les erreurs suivantes:

 /usr/lib/gcc/i686-pc-linux-gnu/4.3.2/include/g++-v4/bits/stl_construct.h: Dans la fonction 'void std :: _ Destroy (_Tp *) [avec _Tp = char [100 ]] ':
 /usr/lib/gcc/i686-pc-linux-gnu/4.3.2/include/g++-v4/bits/stl_construct.h:103: instanciée depuis 'void std :: _ Destroy (_ForwardIterator, _ForwardIterator) [avec _ForwardIterator car (*) [100]] '
 /usr/lib/gcc/i686-pc-linux-gnu/4.3.2/include/g++-v4/bits/stl_construct.h:128: instancié à partir de 'void std :: _ Destroy (_ForwardIterator, _ForwardIterator, stD :: alloc & ) [avec _ForwardIterator = char (*) [100], _Tp = char [100]] '
 /usr/lib/gcc/i686-pc-linux-gnu/4.3.2/include/g++-v4/bits/stl_vector.h:300: instancié à partir de 'std :: vector :: ~ vector () [avec _Tp = char [100], _Alloc = std :: allocator] '
 test.cpp: 7: instancié à partir d'ici
 /usr/lib/gcc/i686-pc-linux-gnu/4.3.2/include/g++-v4/bits/stl_construct.h:88: erreur: demande de membre '~ char [100]' dans '* __pointer' , qui est du type non-classe 'char [100]'

La raison en est apparemment ce bit

  include / g ++ - v4 / bits / stl_construct.h 

  template inline void _Destroy(_Tp* __pointer) { __pointer->~_Tp(); } 

ce qui s’appelle, je pense, en raison d’un tableau-à-pointeur-decay incorrect.

Ma question est la suivante: existe-t-il quelque chose dans le standard de langage qui empêche le stockage de tableaux dans std :: vector? Ou est-ce juste un bug dans cette version spéciale de GCC?

Je crois que cela devrait comstackr (ie 4.2.3 est correct).

Merci martin

Oui, il y a quelque chose dans la norme qui cesse d’utiliser des tableaux. Utiliser Draft C ++ 98 Standard

Section 23 Conteneurs

Le type d’objects stockés dans ces composants doit répondre aux exigences des types CopyConstructible (20.1.3) et aux exigences supplémentaires des types d’affectation.

où les composants sont divers conteneurs

20.1.3 inclut l’exigence que le type doit avoir un destructeur.

Je pense à cela comme un vecteur doit copier allouer et supprimer des éléments. Comment C ++ sait-il copier ou supprimer un caractère []?

Non, ce n’est pas autorisé, tout comme ce n’était pas permis dans la question à laquelle vous avez lié le lien (et je ne vois pas en quoi la “raison est différente”). Ce n’est pas un “bug” dans l’une ou l’autre des deux questions. Ou du moins, pas un bug dans le compilateur. Juste dans votre code. 😉

Vous ne pouvez pas stocker un tableau dans un vecteur, car un vecteur nécessite que ses éléments soient constructibles par copie et assignables.

La solution la plus simple consiste à:

 std::vector > ca_vector; 

De cette façon, vous n’avez pas à vous soucier de l’histoire tableau / pointeur. Si vous voulez vraiment cela, est une autre question.

S’il vous plaît laissez-moi savoir l’esprit de ce code. Vous savez déjà que vector est aussi une sorte de tableau et vous n’avez pas à donner de taille initiale.

 1D vector -> std::vector ca_vector; 2D vector -> std::vector ca_vector;