[C++] Templates en friends, friend krijgt geen toegang?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Arjan
  • Registratie: Juni 2001
  • Niet online

Arjan

copyright is wrong

Topicstarter
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
template < class T >
class B;

template < class T >
class A
{
    int value;

    template < class U >
    friend class B;
};

template < class T >
class B
{
    public:
        A< T > *a;
};

int main( int argc, char **argv )
{
    B< int > b;

    b.a->value = 0;

    return 0;
}


Dit is niet toegestaan, de compiler zegt:
main.cpp:7: error: ‘int A<int>::value’ is private
Wie kan mij uitleggen waarom? In mijn beleving zou 'B' de friend moeten zijn van A, en daarom dus ook aan de private member 'value' mogen komen...

oprecht vertrouwen wordt nooit geschaad


Acties:
  • 0 Henk 'm!

  • Mijzelf
  • Registratie: September 2004
  • Niet online
Moet dat niet
friend template<> class B;
zijn, of
friend template<T> class B;
?

Acties:
  • 0 Henk 'm!

  • Arjan
  • Registratie: Juni 2001
  • Niet online

Arjan

copyright is wrong

Topicstarter
Mijzelf schreef op vrijdag 03 september 2010 @ 14:11:
Moet dat niet
friend template<> class B;
zijn, of
friend template<T> class B;
?
Dat mag beide niet
C++:
1
friend class B< T >;

zou nog kunnen, om alleen instanties van hetzelfde type friend te maken, maar dat geeft verder dezelfde foutmelding :?

oprecht vertrouwen wordt nooit geschaad


Acties:
  • 0 Henk 'm!

  • Mijzelf
  • Registratie: September 2004
  • Niet online
Bij nader inzien is het helemaal B niet die bij die member wil komen, maar main().
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template < class T > 
class B 
{ 
    public: 
    void SetValue( T t )
    {
        a->value = t;
    }
    A< T > *a; 
}; 

int main( int argc, char **argv ) 
{ 
    B< int > b; 
    b.SetValue( 0 );
    return 0;
}

zou moeten werken.

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 16:28
Mijzelf schreef op vrijdag 03 september 2010 @ 14:11:
Moet dat niet
friend template<> class B;
zijn?
Dit is een specialisaties van B, geen verwijzing naar B zelf. De code van Arjan in de TS is correct (en je hebt zelf de oplossing voor zijn probleem al gegeven ;)). Ik zou zelf ook overwegen om gewoon friend class B<T>; te schrijven als dat voldoende is. Korter en meer specifiek. Maar de huidige code kan ook om álle instanties van B friends te maken van álle instanties van A (ook als hun parameters niet overeenkomen).

[ Voor 6% gewijzigd door Soultaker op 03-09-2010 18:06 ]


Acties:
  • 0 Henk 'm!

  • Arjan
  • Registratie: Juni 2001
  • Niet online

Arjan

copyright is wrong

Topicstarter
Mijzelf schreef op vrijdag 03 september 2010 @ 15:23:
Bij nader inzien is het helemaal B niet die bij die member wil komen, maar main().
[...]
soms is het antwoord heel simpel :D

thanks!

oprecht vertrouwen wordt nooit geschaad

Pagina: 1