J'utilise GCC 4.8 pour compiler le code suivant:
^
5 Réponses :
en C ++ STRIT, tous les membres sont publics par défaut. Dans une déclaration de classe, les membres sont privés par défaut. Dans votre cas, des constructeurs ont été fabriqués privés, c'est pourquoi vous obtenez l'erreur :: s (int) était privée
donc, apportez les modifications apportées comme: p>
Je ne veux pas rendre les constructeurs publics. C'est pourquoi j'ai introduit Create (), en outre, pour certaines raisons, le constructeur privé S () ne rend pas la compilation échoue lorsqu'il est privé, tandis que S (int) rend la compilation échoue ...
Quelqu'un peut-il m'expliquer la raison de cette erreur du compilateur? P> blockQuote>
Le constructeur qui prend
int code> est déclaré être déclaré
privé code>, c'est pourquoi il donne une erreur de compilation. Notez que le constructeur est invoqué à partir de
make_unique code> (qui n'a pas accès à des membres privés), pas à partir de
Créer code>. P>.
Cependant, vous vous demandez probablement pourquoi le premier appel à
CREATE () CODE> compile une amende, je pense que c'est parce que GCC a un bug fort>. Il ne devrait pas compiler même dans ce cas, car le constructeur par défaut est déclaré être
privé code> aussi.
CLIG donne correctement une erreur pour les deux appels forts> ( Voir ceci ). P> Quoi qu'il en soit, si vous voulez les garder
privé code>, puis faire
make_unique code> un ami de la classe. P>
Si un constructeur est privé, cela signifie que personne mais la classe elle-même (et les amis) devrait pouvoir créer des instances de celui-ci en utilisant ce constructeur. P>
Pour créer une instance d'une classe qui n'a que des constructeurs privés, vous devez utiliser une méthode statique. P>
La raison est assez simple: p>
Le constructeur n'est pas appelé à partir de Une solution simple serait d'appeler En réalité, la question la plus intéressante est la raison pour laquelle il n'éteigne pas le premier appel ... p> S :: Créer code>, mais à partir du modèle de fonction
:: make_unique Code> qui n'a pas accès à la fonction membre privé < Code> S :: s (int) code>. p>
neuf code> vous-même (voir ici ). < / p>
Je pense que le problème de l'OP est qu'il (assez raisonnablement!) Veut éviter d'appeler nouveau code> explicitement en code.
Si vous souhaitez conserver les constructeurs de la classe privée, vous devez créer un utilisateur non membre (ici: Peut éviter make_unique code>) Un ami:
make_unique <> code> et créer directement le
unique_ptr
code> à partir d'un élément statique: p>