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.

Était-ce utile?

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

    }
}}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top