déclarer modèle amie fonction de la classe de modèle
J'ai un modèle de classe Obj
et un modèle de fonction make_obj
. Obj
a un private
seul constructeur défini, qui prend une référence à son basé sur un modèle de type à se lier à.
template <typename T>
class Obj {
private:
T& t;
Obj(T& t)
: t{t}
{ }
};
template <typename T>
Obj<T> make_obj(T& t) {
return {t};
}
Ce que je veux, c'est de déclarer la make_obj
fonction d'un friend
afin qu'il puisse créer Obj
's, mais personne ne peut (sauf via la copie ctor).
J'ai essayé plusieurs ami déclaration, y compris
friend Obj make_obj(T&);
et
template <typename T1, typename T2>
friend Obj<T1> make_obj(T2&);
Ce dernier étant moins souhaitable tentative à ce que toutes les instanciations du modèle de make_obj
amis de la Obj
classe. Toutefois, dans ces deux cas, j'obtiens le même message d'erreur:
error: calling a private constructor of class 'Obj<char const[6]>'
return {t};
^
note: in instantiation of function template specialization
'make_obj<const char *>' requested here
auto s = make_obj("hello");
^
essayer de faire make_obj("hello");
pour les fins de l'exemple.
Comment puis-je autoriser uniquement les make_obj
accès à Obj
's la valeur constructeur?
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin d'un peu de sa déclaration:
live exemple
Et BTW: je ne pense pas que vous voulez vraiment
T & t;
pour votre classe variable membre. ProbablementT t;
est un meilleur choix 😉make_obj<A>
besoin d'un accès àObj<A>
, pas besoin d'activer l'accès àmake_obj<Z>
!] --pour l'enregistrement:friend Obj<T> make_obj<T>(T t);
au lieu de se lier d'amitié avec le modèleAvec le retour automatique du type de syntaxe, vous avez seulement besoin de déclarer avant la fonction et tout fonctionne. Voici un exemple
https://ideone.com/3k86gx