Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Template-Klassen als friend

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
13.12.2005, 14:25 Uhr
stephanw
localhorst


Hi,
ich möchte in einer Template-Klasse einen Template-Konstruktor haben, der zur Typkonvertierung benutzt werden kann.
Etwa so:


C++:
template<typename T> class List
{
public:
    List();
    template<typename S> List( const List<S>& other );
    // ...
};



Nun hätte ich gern privaten Zugriff auf List<S>, aber alle meine Versuche, sämtliche List-Instanziierungen als Freunde zu deklarieren, wollte mein Compiler nicht schlucken. Geht das und wie ist die korrekte Schreibweise ?
--
Reden ist Schweigen und Silber ist Gold.

Dieser Post wurde am 13.12.2005 um 14:25 Uhr von stephanw editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.12.2005, 16:15 Uhr
virtual
Sexiest Bit alive
(Operator)


Hm, und was machst Du, wenn es eine Ganzspezielle Templatespezialisierung gibt?
Ich mein, normalerweise wird deine Liste wohl irgendwie so aussehen, gelle?

C++:
template<typename T> class List {
private:
    int private_feld;
};


Und du willst Freund werden mit der Liste, weil Du auf private_feld zugreifen willst.

Aber was machst Du denn, wenn jemand folgendes macht:

C++:
template<> class List<char> {

}


Also eine Spezialisierung schreibt, wo es private_feld gar nicht gibt?

Ich weiß nicht, ob dein Vorhaben prinzipiell möglich ist (ich glaube nein), designtechnisch problematisch ist es aber jedenfalls.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
13.12.2005, 16:22 Uhr
stephanw
localhorst


Hm, dann würde es nicht kompilieren. Ich kann es ja etwas konkretisieren, es geht eigentlich um einen Smartpointer mit privatem Zeiger auf einen Referenz-Counter. Ich brauche also diesen Zeiger und möchte selbigen nicht nur aus diesem Grund öffentlich zugreifbar machen, auch nicht über eine const* - Funktion und hässlichem const-weg-casten. Gibt es dafür eine andere Möglichkeit ?
--
Reden ist Schweigen und Silber ist Gold.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
14.12.2005, 16:55 Uhr
stephanw
localhorst


Habe den gleichen Fall im Boost shared_ptr gefunden:

C++:
template<class T> class shared_ptr
{
    // ...
    template<class Y> friend class shared_ptr;
};



Eigentlich ganz einfach, aber irgendwie bin ich nicht drauf gekommen. Eine Alternative fiel mir auch nicht ein
--
Reden ist Schweigen und Silber ist Gold.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
14.12.2005, 17:52 Uhr
(un)wissender
Niveauwart


Bin mir nicht sicher, dass das portabel ist. Habe da einiges gelesen... Aber wenn die von boost das verwenden wird es schon passen.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
14.12.2005, 18:17 Uhr
stephanw
localhorst


Naja, nicht ganz. Ist in ein Macro eingeschachtelt und wahlweise public:

(Zitat aus boost/shared_ptr.hpp)

C++:
template<class T> class shared_ptr
{
public:
// ...


// Tasteless as this may seem, making all members public allows member templates
// to work in the absence of member template friends. (Matthew Langston)

#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS

private:

    template<class Y> friend class shared_ptr;
    template<class Y> friend class weak_ptr;


#endif

    T * px;                     // contained pointer
    detail::shared_count pn;    // reference counter

};  // shared_ptr



Wie auch immer, der G++ und der VC7 haben es gefressen, das reicht mir vorerst.
--
Reden ist Schweigen und Silber ist Gold.

Dieser Post wurde am 14.12.2005 um 18:18 Uhr von stephanw editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: