Comment puis-je lier d'amitié avec une classe de modèle dans un espace de noms parent?
-
12-12-2019 - |
Question
J'ai du mal à faire ma classe d'être un ami d'un modèle dans son espace de noms parent.Quelqu'un peut m'expliquer ce que je fais mal:
Voici mes tentatives et leurs erreurs avec MSVC8 (Visual Studio 2005):
namespace a {
namespace b {
template<typename T>
class x;
namespace c {
class y
{
template<typename T>
friend class x;
...
};
}
}}
erreur C2888: a::b::x
:symbole ne peuvent pas être définies à l'intérieur de l'espace de noms c
namespace a {
namespace b {
template<typename T>
class x;
namespace c {
class y
{
template<typename T>
friend class ::a::b::x;
...
};
}
}}
erreur C2888: a::b::x
:symbole ne peuvent pas être définies à l'intérieur de l'espace de noms c
namespace a {
namespace b {
namespace c {
class y
{
template<typename T>
friend class ::a::b::x;
...
};
}
}}
error C2039: x
:n'est pas membre de a::b
Je ne peux pas il suffit d'inclure le fichier d'en-tête contenant class x
comme il dépend de class y
conduisant à une inclusion circulaire.
La solution
Un hack solution de contournement:Si vous connaissez les tous les types spécifiques le modèle sera jamais instanciée avec, amitié avec à chaque instanciation plutôt que sur le modèle.Par exemple:
namespace a {
namespace b {
template<typename T>
class x;
namespace c {
class y
{
friend class x<char>;
friend class x<wchar_t>;
...
};
}
}}