Problème d'accessibilité avec friend et template

Le
Davidbrcz
Bonjour à tous.
Le code suivant me donne un problème d'accessibilité dans
middleman::get.


template<int cycle> class angle
{
protected:
int agl;

template <int N> struct middleman
{
friend class angle<N>;

int get(const angle<N> a)
{return a.agl;}
};

public:
angle(int a=0){agl=a;};

template<int acycle> angle(angle<acycle> a){agl=middleman<acycle>
().get(a);}
};

int main()
{
angle<5> aa;
angle<6> bb(aa);

return 0;
}

GCC me dit que a.agl est protected.

une idée pour résoudre ceci ?

Merci beacoup.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Davidbrcz
Le #18946711
On 20 mar, 22:57, Davidbrcz
Bonjour à tous.
Le code suivant me donne un problème d'accessibilité dans
middleman::get.

template<int cycle> class angle
{
    protected:
    int agl;

    template <int N> struct middleman
    {
        friend class angle<N>;

        int get(const angle<N> a)
        {return a.agl;}
    };

    public:
    angle(int a=0){agl=a;};

    template<int acycle> angle(angle<acycle> a){agl=middleman<acycl e>
().get(a);}

};

int main()
{
    angle<5> aa;
    angle<6> bb(aa);

  return 0;

}

GCC me dit que a.agl est protected.

une idée pour résoudre ceci ?

Merci beacoup.



La fatigue sans doute m'a fait placer l'amitié à la mauvaise place.

Ma nouvelle classe est donc:
//...

template <int N> struct middleman
{
int get(angle<N> a)
{return a.agl;}
};
template <int N> friend int middleman<N>::get(angle<N> a);

//...

Sauf que g++ me dit :

error: too few template-parameter-lists
Jean-Marc Bourguet
Le #18947801
Davidbrcz
On 20 mar, 22:57, Davidbrcz
Bonjour à tous.
Le code suivant me donne un problème d'accessibilité dans
middleman::get.

template<int cycle> class angle
{
    protected:
    int agl;

    template <int N> struct middleman
    {
        friend class angle<N>;

        int get(const angle<N> a)
        {return a.agl;}
    };

    public:
    angle(int a=0){agl=a;};

    template<int acycle> angle(angle<acycle> a){agl=middleman<acycle>
().get(a);}

};

int main()
{
    angle<5> aa;
    angle<6> bb(aa);

  return 0;

}

GCC me dit que a.agl est protected.

une idée pour résoudre ceci ?

Merci beacoup.



La fatigue sans doute m'a fait placer l'amitié à la mauvaise place.

Ma nouvelle classe est donc:
//...

template <int N> struct middleman
{
int get(angle<N> a)
{return a.agl;}
};
template <int N> friend int middleman<N>::get(angle<N> a);

//...

Sauf que g++ me dit :

error: too few template-parameter-lists



template<int cycle> class angle
{
protected:
int agl;
public:
template <int N> struct middleman
{
int get(const angle<N> a)
{return a.agl;}
};

template <int cycle2>
template <int N>
friend int ::angle<cycle2>::template middleman<N>::get(const angle<N>);

public:
angle(int a=0){agl=a;};

template<int acycle> angle(angle<acycle> a)
{ agl=middleman<acycle>().get(a); }
};

int main()
{
angle<5> aa;
angle<6> bb(aa);

return 0;
}

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Davidbrcz
Le #18948221
On 21 mar, 09:54, Jean-Marc Bourguet
template<int cycle> class angle
{
protected:
    int agl;
public:    
    template <int N> struct middleman
    {
        int get(const angle<N> a)
            {return a.agl;}
    };

    template <int cycle2>
    template <int N>
      friend int ::angle<cycle2>::template middleman<N>::get(const angle<N>);

public:
    angle(int a=0){agl=a;};

    template<int acycle> angle(angle<acycle> a)
        { agl=middleman<acycle>().get(a); }

};

int main()
{
    angle<5> aa;
    angle<6> bb(aa);

  return 0;

}




Hum. La compilation plante sur la déclaration d'amitié:
a.cpp:15: error: too many template-parameter-lists

Je compile avec g++ 4.3.3 sous debian sid
Jean-Marc Bourguet
Le #18948621
Davidbrcz
On 21 mar, 09:54, Jean-Marc Bourguet
template<int cycle> class angle
{
protected:
    int agl;
public:    
    template <int N> struct middleman
    {
        int get(const angle<N> a)
            {return a.agl;}
    };

    template <int cycle2>
    template <int N>
      friend int ::angle<cycle2>::template middleman<N>::get(const angle<N>);

public:
    angle(int a=0){agl=a;};

    template<int acycle> angle(angle<acycle> a)
        { agl=middleman<acycle>().get(a); }

};

int main()
{
    angle<5> aa;
    angle<6> bb(aa);

  return 0;

}




Hum. La compilation plante sur la déclaration d'amitié:
a.cpp:15: error: too many template-parameter-lists

Je compile avec g++ 4.3.3 sous debian sid



Effectivement.
Ca passe avec Comeau, g++ 4.2 mais pas avec g++ 4.3, Sun CC ni icpc.

J'ai pas le temps pour le moment de chercher qui a raison et qui a tord, ni
de trouver une alternative.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Davidbrcz
Le #18949111
On 21 mar, 11:51, Jean-Marc Bourguet
Davidbrcz > On 21 mar, 09:54, Jean-Marc Bourguet
>> template<int cycle> class angle
>> {
>> protected:
>>     int agl;
>> public:    
>>     template <int N> struct middleman
>>     {
>>         int get(const angle<N> a)
>>             {return a.agl;}
>>     };

>>     template <int cycle2>
>>     template <int N>
>>       friend int ::angle<cycle2>::template middleman<N>::get(con st angle<N>);

>> public:
>>     angle(int a=0){agl=a;};

>>     template<int acycle> angle(angle<acycle> a)
>>         { agl=middleman<acycle>().get(a); }

>> };

>> int main()
>> {
>>     angle<5> aa;
>>     angle<6> bb(aa);

>>   return 0;

>> }

> Hum. La compilation plante sur la déclaration d'amitié:
> a.cpp:15: error: too many template-parameter-lists

> Je compile avec g++ 4.3.3 sous debian sid

Effectivement.
Ca passe avec Comeau, g++ 4.2 mais pas avec g++ 4.3, Sun CC ni icpc.

J'ai pas le temps pour le moment de chercher qui a raison et qui a tord, ni
de trouver une alternative.

A+

--
Jean-Marc
FAQ de fclc++:      http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF:http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index .html
Site de usenet-fr:  http://www.usenet-fr.news.eu.org




Avec cette déclaration, ca marche avec g++ 4.3
template <int cycle2>
template <int N>
friend int ::angle<cycle>::template middleman<N>::get(const
angle<N>);
Davidbrcz
Le #18949181
On 21 mar, 12:56, Davidbrcz

JMB > Sais tu où je pourrais apprendre ce genre de subtilités ? Car
cette syntaxe est quand même hard et je ne comprends pas tout, en
particulier le template qui se balade au millieu.

Merci.
Jean-Marc Bourguet
Le #18951071
Davidbrcz
On 21 mar, 12:56, Davidbrcz

JMB > Sais tu où je pourrais apprendre ce genre de subtilités ? Car
cette syntaxe est quand même hard et je ne comprends pas tout, en
particulier le template qui se balade au millieu.



Ce template est l'équivalent du typename. Il indique qu'un nom dépendant
est un template.

La référence pour le moment, ça reste le bouquin de D. Vandevoorde et de
N. Josuttis, C++ Templates, The Complete Guide.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Publicité
Poster une réponse
Anonyme