Comment déclarer un vecteur de unique_ptr est comme données de la classe de membre?
J'aimerais avoir un vecteur de unique_ptr est comme un membre d'une classe, je suis en train de faire.
class Foo {
[...]
private:
vector<unique_ptr<Bar>> barList;
}
Mais ensuite j'ai commencer à obtenir des messages d'erreur cryptique de la VS2010 compilateur:
error C2248: 'std::unique_ptr<_Ty>::operator =' : cannot access private member declared in class 'std::unique_ptr<_Ty>'
Avec une poignée de lignes d'erreur en dessous de plonger dans l'implémentation de Microsoft std::_Copy_impl<>
...
J'ai changé la déclaration d'un membre de
vector<unique_ptr<Bar>>* barList;
Et il compile. Mais je ne peux pas aider mais se demander pourquoi je ne peut pas le faire de la façon que je voulais? Pour sourire, je l'ai essayé et il fonctionne très bien:
vector<Bar> barList;
Mais maintenant je perds la commodité de unique_ptr
. Je veux mon gâteau et je veux en manger trop!
J'étais en train de regarder stackoverflow.com/questions/8553464/vector-as-a-class-member et la réponse semble penser de la déclaration d'une
Ce n'votre constructeur de copie et l'opérateur d'affectation?
Privé d'affectation, mais le constructeur de copie était le coupable. Commutation de
vector
comme je l'ai fait, c'est correct de le faire. Pour une raison quelconque, cependant, il semble déclencher des copies illégales lors de l'ajout de la unique_ptr
partie.Ce n'votre constructeur de copie et l'opérateur d'affectation?
Privé d'affectation, mais le constructeur de copie était le coupable. Commutation de
unique_ptr
à shared_ptr
quand j'ai réalisé que j'ai été en utilisant le mauvais propriété sémantique.
OriginalL'auteur Bret Kuhns | 2012-01-24
Vous devez vous connecter pour publier un commentaire.
Le problème ici c'est que quelque part, votre code est de tenter d'appeler le "copier-cession" de l'opérateur de
Foo
.Cela provoque le compilateur pour essayer de générer une copie-opérateur d'affectation qui appelle à la copie des opérateurs d'affectation de tous les sous-objets de
Foo
. Finalement, ce qui conduit à une tentative de copie d'ununique_ptr
, une opération qui n'est pas possible.Foo
classe a un constructeur de copie, et j'ai essayé de copier le vecteur de la sourceFoo
. Le partage de la propriété semble être la meilleure solution, afin de changer deshared_ptr
a fait le tour.Il ressemble à un bug dans VS2010, j'obtiens cette erreur, même si mon code n'essaie jamais d'appeler copier-transfert. La désactivation de l'opérateur= de déclarer que privé (donc =supprimer n'est pas pris en charge) permet de résoudre le problème.
OriginalL'auteur Mankarse
unique_ptr
n'a pas de sémantique de copie, de sorte que vous ne pouvez pas utiliser les méthodes de copier le contenu de l'objet. Vous peut le faire avec des références rvalue en utilisantstd::move
dans la place(s) qu'il essaie de faire une copie. Sans voir ton code je ne peux pas dire où ce serait.Si il compile dans la deuxième forme soit vous n'avez pas exercer le même code ou il y a un bogue du compilateur. Les deux devraient l'échec de la même façon.
Votre troisième exemple, le stockage en valeur est la façon la plus simple, à moins que vos objets sont grand et cher magasin/copie par valeur.
auto_ptr
est celui qui n'obéit pas normal sémantique de copie,unique_ptr
n'est pas simplement la sémantique de copieVotre et Mankarse réponses sont très très similaires. Son, cependant, m'a fait réaliser que je devais aller sur une chasse aux sorcières pour le code fautif (votre réponse abordé cette question de manière plus subtile). Vous les méritez accepté la réponse. Merci pour l'aide!
OriginalL'auteur Mark B
Souvent un
std::move(iUniquePtr)
est manquant quelque part (e. g. lors de l'utilisation de push_back).OriginalL'auteur Sonic78
Un des extraits de http://www.cplusplus.com
unique_ptr affectation
L'objet acquiert la propriété de x contenu, y compris le pointeur stocké et stockées deleter (de même que la responsabilité de la suppression de l'objet à un certain point). Tout objet appartenant à l'unique objet avant l'appel est supprimé (comme si unique_ptr le destructeur de a été appelé).
Mais il y a un avertissement:
Cette page décrit une fonctionnalité introduite par la dernière révision de la norme C++ (2011). Les compilateurs plus âgés ne peuvent pas le supporter.
MSVC 2010 définit
operator=
privé (non-copiable), mais prend en chargeswap
méthode.OriginalL'auteur ibre5041
Vous ne pouvez pas utiliser unique_ptr dans le vecteur parce que vecteur de la mise en œuvre repose fortement sur les valeurs affecter l'opérateur, qui est privé,
unique_ptr
. Utilisationshared_ptr
de boost ou d'autres smart ptr mise en œuvre à partir de C++11.unique_ptr
fonctionne très bien dans unvector
. Afficher.C++11 conteneurs sont nécessaires pour travailler avec les déplacer uniquement des types comme
unique_ptr
.Je parlais de la façon dont il l'a utilisé. Mais encore, merci, je ne connaissais pas emplace_back.
Vous n'avez pas besoin d'utiliser emplace_back. Vous pouvez utiliser push_back aussi longtemps que vous donnez de r-valeurs.
OriginalL'auteur aambrozkiewicz