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
Versuch' s mal damit:
template< typename > class Freund;
class Geheim
{
template< typename > friend class Freund;
};
Besten Gruss aus Bremen,
Daniel Krügler
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>;
};
> 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>;
};
> 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
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 {};
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
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