439 votes

Pourquoi je ne peux pas faire un vecteur de références?

Quand je fais ceci:

 std::vector<int> hello;
 

Tout fonctionne bien. Cependant, quand j'en fais un vecteur de références à la place:

 std::vector<int &> hello;
 

Je reçois des erreurs horribles comme "l'erreur C2528: 'pointeur': le pointeur vers la référence est illégal".

Je veux mettre un tas de références à des structures dans un vecteur, de sorte que je n'ai pas à me mêler de pointeurs. Pourquoi le vecteur lance-t-il une crise à ce sujet? Est-ce que ma seule option est d'utiliser un vecteur de pointeurs à la place?

416voto

newacct Points 42530

Le type de composant des conteneurs tels que les vecteurs doit être Assignable . Les références ne sont pas assignables (vous ne pouvez les initialiser qu'une seule fois lorsqu'elles sont déclarées, et vous ne pouvez pas les faire référence à quelque chose d'autre plus tard). Les autres types non assignables ne sont pas autorisés en tant que composants de conteneurs, par exemple vector<const int> n'est pas autorisé.

153voto

Ion Todirel Points 1731

oui vous pouvez, cherchez std::reference_wrapper , cela imite une référence mais est assignable et peut aussi être "repositionné"

85voto

Mehrdad Afshari Points 204872

Vous devez régler avec des pointeurs. Comme l'erreur du compilateur dit, en interne, vector voudra avoir une variable de type T* qui ne fonctionnera pas si T est une référence.

43voto

James Curran Points 55356

De par leur nature, les références ne peuvent être définies qu'au moment de leur création; c'est-à-dire que les deux lignes suivantes ont des effets très différents:

 int & A = B;   // makes A an alias for B
A = C;         // assigns value of C to B.
 

De plus, c'est illégal:

 int & D;       // must be set to a int variable.
 

Cependant, lorsque vous créez un vecteur, il n'y a aucun moyen d'attribuer des valeurs à ses éléments lors de la création. Vous faites essentiellement tout un tas d'exemples.

15voto

Drew Dormann Points 25025

boost::ptr_vector<int> fonctionnera.

Edit: était une suggestion pour utiliser std::vector< boost::ref<int> > , ce qui ne fonctionnera pas car vous ne pouvez pas construire par défaut un boost::ref .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X