Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

template Classe als friend

1 view
Skip to first unread message

Mario Schunda

unread,
Jul 26, 2009, 4:06:35 PM7/26/09
to
Hallo

Wie weise ich eine Template Classe als Freund zu?

Normal geht das ja so.

class Freund {};

class Geheim
{
friend class Freund;
};


Wie geht das aber mit einer template classe ?

template< typename > class Freund {};

class Geheim
{
friend ?????
};

Alles was ich Probiert habe erzeugt nur Compiler Fehler :-(

Mario

Daniel Krügler

unread,
Jul 27, 2009, 3:18:10 AM7/27/09
to

Versuch' s mal damit:

template< typename > class Freund;

class Geheim
{
template< typename > friend class Freund;
};

Besten Gruss aus Bremen,

Daniel Krügler

litb

unread,
Jul 27, 2009, 3:36:02 AM7/27/09
to
On Jul 26, 10:06 pm, Mario Schunda <weg_ma...@familie-schunda.de>
wrote:

> Hallo
>
> Wie weise ich eine Template Classe als Freund zu?
>
> Normal geht das ja so.
>
> class Freund {};
>
> class Geheim
> {
>   friend class Freund;
>
> };
>
> Wie geht das aber mit einer template classe ?
>
> template< typename > class Freund {};
>
> class Geheim
> {
>   friend ?????
>
> };
>
class Geheim {
// template Freund, für alle T, ist ein freund

template<typename> friend class Freund;
};

Falls du nur bestimmte spezialisierungen befreunden möchtest:

// Forwärts-deklaration nicht vergessen
// (oder Freund vorher definieren)


template< typename > class Freund;
class Geheim {

// Freund mit T=Geheim ist ein freund.
friend class Freund<Geheim>;
};

Thomas Maeder

unread,
Jul 27, 2009, 10:58:16 AM7/27/09
to
Mario Schunda <weg_...@familie-schunda.de> writes:

> Wie weise ich eine Template Classe als Freund zu?

<pingelig>
Es handelt sich hier nicht um eine Zuweisung, sondern um eine
Deklaration.
</pingelig>


> Normal geht das ja so.
>
> class Freund {};
>
> class Geheim
> {
> friend class Freund;
> };
>
>
> Wie geht das aber mit einer template classe ?
>
> template< typename > class Freund {};
>
> class Geheim
> {
> friend ?????
> };
>
> Alles was ich Probiert habe erzeugt nur Compiler Fehler :-(


[Was hast Du denn alles probiert?]


Zunächst musst Du Dich festlegen, was Du genau als Freund von Geheim
deklarieren willst; die typischen Fälle sind:
- alle Spezialisierungen von Freund
- 1 bestimmte Spezialisierung von Freund


Der erste Fall geht so:

template <typename>
class Freund
{
};

class Geheim
{


template <typename>
friend class Freund;
};


Und der zweite so:

template <typename>
class Freund
{
};

class Geheim
{
friend class Freund<int>;
};

SG

unread,
Jul 27, 2009, 4:41:12 AM7/27/09
to
Am 26. Jul., 22:06, Mario Schunda schrieb:

> Wie weise ich eine Template Classe als Freund zu?
> Normal geht das ja so.
>
> class Freund {};
>
> class Geheim
> {
>   friend class Freund;
> };
>
> Wie geht das aber mit einer template classe ?

Meinst Du das ganze "Klassen-Template" oder nur eine Spezialisierung?

> template< typename > class Freund {};
>
> class Geheim
> {
>   friend ?????
> };
>
> Alles was ich Probiert habe erzeugt nur Compiler Fehler :-(

Je nachdem, was Du willst:

// Nur Freund<int> soll Freund sein
friend class Freund<int>;

oder

// Freund<T> für beliebiges T soll Freund sein


template<typename> friend class Freund;

Gruß,
SG

"Björn K."

unread,
Jul 27, 2009, 5:49:51 AM7/27/09
to
Mario Schunda schrieb:

Also Du meinst f�r alle Klassen aus dieser Template, nicht nur eine
bestimmte Klasse? Ich kenne mich nicht richtig aus und lese das Forum
nur, weil ich in C++ reinwill, aber so auf Anhieb w�rde ich sagen, Du
definierst einen abstrakte Basisklasse BasisFreund, und l�sst die
Template diese Basisklasse implementieren.

class BasisFreund {};
template < T > class Freund : public BasisFreund {};

Mario Schunda

unread,
Jul 27, 2009, 3:35:59 PM7/27/09
to
Danke schᅵn an alle.

Habe jetzt meinen Fehler erkannt...

Bin einfach nicht drauf gekommen das friend hinter das Template zu
schreiben. :-(

template< typename > friend class Geheim;

Hab das immer voran geschrieben.

friend template< typename > class Geheim;

Grumpf, da denkt man, man hat C++ verstanden und dann so was. :-)

Mario

Stefan Reuther

unread,
Jul 28, 2009, 1:14:07 PM7/28/09
to
Bj锟絩n K. wrote:
> Mario Schunda schrieb:

>> Wie weise ich eine Template Classe als Freund zu?
>
> Also Du meinst f锟絩 alle Klassen aus dieser Template, nicht nur eine

> bestimmte Klasse? Ich kenne mich nicht richtig aus und lese das Forum
> nur, weil ich in C++ reinwill, aber so auf Anhieb w锟絩de ich sagen, Du
> definierst einen abstrakte Basisklasse BasisFreund, und l锟絪st die

> Template diese Basisklasse implementieren.
>
> class BasisFreund {};
> template < T > class Freund : public BasisFreund {};

Freundschaft wird nicht vererbt, 'Freund<T>' hat also keinen Zugriff auf
die Klasse 'Geheim'.

Allerdings kann es dennoch sinnvoll sein, so ein Konstrukt zu verwenden.
Wenn man die Methoden, die Zugriff auf die Eigenschaften von 'Geheim'
haben sollen, in die Basisklasse packen kann, arbeitet die Basisklasse
als zus锟絫zlicher Schutz der Innereien von 'Geheim'.

So sieht zwar
template<typename T> class Freund;
class Geheim {
int a, b;
template<typename T> friend class Freund;
// ...
};
template<typename T> class Freund {
public:
void narf(Geheim& g) { g.a++; }
};
so aus, als ob nur der Member 'a' vom Freund modifiziert w锟絩de,
allerdings kann der Nutzer sich jederzeit Zugriff verschaffen:
namespace { struct zz; }
template<> class Freund<zz> {
public:
void narf(Geheim& g) { g.b++; }
};

Mit einer zum Freund deklarierten Basisklasse geht das nicht:
class BasisFreund;
class Geheim {
int a, b;
friend class BasisFreund;
// ...
};
class BasisFreund {
public:
void narf(Geheim& g) { g.a++; }
};
template<typename T> class Freund : public BasisFreund {
// ...
void zot(Geheim& g) { g.a++; } // hier kein Zugriff
// muss Basisklassenmethode nutzen
};


Stefan

0 new messages