Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème d'accessibilité avec friend et template

7 réponses
Avatar
Davidbrcz
Bonjour =E0 tous.
Le code suivant me donne un probl=E8me d'accessibilit=E9 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=3D0){agl=3Da;};

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

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

return 0;
}

GCC me dit que a.agl est protected.

une id=E9e pour r=E9soudre ceci ?

Merci beacoup.

7 réponses

Avatar
Davidbrcz
On 20 mar, 22:57, Davidbrcz wrote:
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
Avatar
Jean-Marc Bourguet
Davidbrcz writes:

On 20 mar, 22:57, Davidbrcz wrote:
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
Avatar
Davidbrcz
On 21 mar, 09:54, Jean-Marc Bourguet wrote:

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
Avatar
Jean-Marc Bourguet
Davidbrcz writes:

On 21 mar, 09:54, Jean-Marc Bourguet wrote:

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
Avatar
Davidbrcz
On 21 mar, 11:51, Jean-Marc Bourguet wrote:
Davidbrcz writes:
> On 21 mar, 09:54, Jean-Marc Bourguet wrote:

>> 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>);
Avatar
Davidbrcz
On 21 mar, 12:56, Davidbrcz wrote:


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.
Avatar
Jean-Marc Bourguet
Davidbrcz writes:

On 21 mar, 12:56, Davidbrcz wrote:


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