J'ai quelques difficultés à essayer d'accéder à un constructeur privé d'une classe dérivée, qui est spécifiée en tant que paramètre de modèle. J'espérais que la spécification friend T
résoudrait le problème, mais malheureusement, cela n'a aucun effet.
template <typename T>
class Creator
{
public:
static void Create()
{
instance = new T;
}
private:
static T* instance;
friend T;
};
template <typename T>
T* Creator<T>::instance(nullptr);
class Test
{
private:
Test() {}
};
Tentative de création:
int main()
{
Creator<Test>::Create();
}
L'erreur que j'obtiens est:
Erreur C2248 'Derived :: Derived': impossible d'accéder au membre privé déclaré dans la classe 'Derived'
Des idées sur la façon dont je pourrais résoudre ce problème s'il vous plaît?
Votre classe Creator n'a pas besoin de donner à un ami l'accès à son paramètre de modèle.
template <typename T>
class Creator
{
public:
static void Create()
{
instance = new T;
}
private:
static T* instance;
// friend T; NOT USEFUL
};
Vous devez fournir un accès ami à partir de la classe qui a le membre privé.
class Test
{
friend Creator<Test>; // provide friend access to Creator<Test> specialization
private:
Test()
{
}
};
Cela permet à votre code de se compiler et d'obtenir le comportement souhaité.
Pour mémoire, en déclarant friend T;
dans votre classe de modèle, vous exposez en fait vos membres privés à tout T dans lequel vous vous spécialisez avec Creator. Vous pourriez donc faire écrire à quelqu'un ...
class Test
{
private:
Test()
{
// you don't really want this, do you?
delete Creator<Test>::instance;
}
};
... s'ils ont utilisé votre modèle Creator.
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots