9
votes

Pourquoi est-ce que je reçois une erreur de compilation?

J'utilise GCC 4.8 pour compiler le code suivant:

                                                             ^


0 commentaires

5 Réponses :


2
votes

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: xxx


1 commentaires

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 ...



11
votes

Quelqu'un peut-il m'expliquer la raison de cette erreur du compilateur?

Le constructeur qui prend int est déclaré être déclaré privé , c'est pourquoi il donne une erreur de compilation. Notez que le constructeur est invoqué à partir de make_unique (qui n'a pas accès à des membres privés), pas à partir de Créer . .

Cependant, vous vous demandez probablement pourquoi le premier appel à CREATE () compile une amende, je pense que c'est parce que GCC a un bug . Il ne devrait pas compiler même dans ce cas, car le constructeur par défaut est déclaré être privé aussi. CLIG donne correctement une erreur pour les deux appels ( Voir ceci ).

Quoi qu'il en soit, si vous voulez les garder privé , puis faire make_unique un ami de la classe.


0 commentaires

1
votes

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.

Pour créer une instance d'une classe qui n'a que des constructeurs privés, vous devez utiliser une méthode statique.


0 commentaires

4
votes

La raison est assez simple:

Le constructeur n'est pas appelé à partir de S :: Créer , mais à partir du modèle de fonction :: make_unique qui n'a pas accès à la fonction membre privé < Code> S :: s (int) .

Une solution simple serait d'appeler neuf vous-même (voir ici ). < / p>

En réalité, la question la plus intéressante est la raison pour laquelle il n'éteigne pas le premier appel ...


1 commentaires

Je pense que le problème de l'OP est qu'il (assez raisonnablement!) Veut éviter d'appeler nouveau explicitement en code.



2
votes

Si vous souhaitez conserver les constructeurs de la classe privée, vous devez créer un utilisateur non membre (ici: make_unique ) Un ami: xxx

Peut éviter make_unique <> et créer directement le unique_ptr à partir d'un élément statique: xxx


0 commentaires