Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Templates

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 < [ 2 ] [ 3 ]
000
19.01.2009, 22:18 Uhr
Suba Esel



Kann man eigentlich ein Template in einem typedef benutzen?


C++:
#include <iostream>

#include <boost/shared_ptr.hpp>

template <typename T>
class TemplateTest
{
    T content_;
public:
    void print()
    {
        std::cout << content_;
    }
    TemplateTest(T content) : content_(content)
    {

    }
};

int main()
{
    boost::shared_ptr<TemplateTest<int> > asdf(new TemplateTest<int>(5));
    asdf->print();
}



Klar, man koennte schreiben:
C++:
typedef boost::shared_ptr<TemplateTest<int> > TemplateTestIntPtr;
und dann entsprechend fuer double usw., aber das ist mir zu umstaendlich...
Ich dachte jetzt an soetwas wie
C++:
typedef template <typename T> boost::shared_ptr<TemplateTest<T> > TemplateTestPtr;
, sodass man
C++:
TemplateTestPtr<int> asdf(new TemplateTest<int>(5));
schreiben koennte, aber das haut so nicht hin.
--
Simon

Dieser Post wurde am 19.01.2009 um 22:19 Uhr von Suba Esel editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.01.2009, 22:43 Uhr
0xdeadbeef
Gott
(Operator)


Eine Vorlage ist kein Typ, deswegen geht das (jedenfalls bisher) nicht. Gerüchteweise soll die nächste Version des C++-Standards einen derartigen Mechanismus bieten. Bis dahin kannst du dir mit Metafunktionen behelfen, etwa:

C++:
template<typename T> struct TemplateTestPtr {
  typedef boost::shared_ptr<TemplateTest<T> > type;
};

// ...

TemplateTestPtr<int>::type asdf(new TemplateTest<int>(5));


Innerhalb anderer Templates halt mit typename TemplateTestPtr<int>::type, aber das kennt man ja.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 19.01.2009 um 22:44 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.01.2009, 23:24 Uhr
~Suba Esel
Gast


Ah, ok, das macht Sinn.
Danke fuer die schnelle Antwort!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
20.01.2009, 00:01 Uhr
Suba Esel



Problem Nummer 2...

main.cpp:

C++:
#include "TestClass.hpp"

int main()
{
    Test<int> asdf;
}



TestClass.hpp:

C++:
template <typename T>
class Test
{
public:
    Test();
};



TestClass.cpp:

C++:
#include "TestClass.hpp"

template <typename T> Test<T>::Test()
{

}



"undefined reference to `Test<int>::Test()" - wieso? Sobald ich den Kram aus der .cpp in die .hpp packe, funktioniert alles tadellos.

Edit: Habe gerade gefunden, dass jemand meinte, man muesse die .cpp in der .hpp includen (was auch funktioniert), aber das kann's ja auch wohl nicht sein.
--
Simon

Dieser Post wurde am 20.01.2009 um 00:14 Uhr von Suba Esel editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
20.01.2009, 00:12 Uhr
0xdeadbeef
Gott
(Operator)


Klassenvorlagen sind keine Klassen. Der Compiler konkretisiert sie zur Compilezeit zu Klassen, um das zu tun, muss er aber die gesamte Definition kennen. Deswegen kommen Templates vollständig in Header.

Eigentlich gibt es im C++-Standard das export-Schlüsselwort, das eine solche Auftrennung ermöglichen soll, meines Wissens implementiert das aber nur der Comeau-Compiler.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
20.01.2009, 00:19 Uhr
Suba Esel



Okay, so ganz habe ich die Erklaerung nicht verstanden - warum bekomme ich einen Linkererror, wenn es ein Compilezeit-Problem ist?
Und verstehe ich das richtig, dass ich einfach die kompletten Definitionen in den Header packe? Damit wuerde irgendwo das .hpp/.cpp-System sinnlos...
Aber wieder einmal schonmal danke fuer die schnelle Antwort!
--
Simon
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
20.01.2009, 00:59 Uhr
0xdeadbeef
Gott
(Operator)


Templates (Vorlagen) müssen dem Compiler vollständig bekannt sein, damit er sie konkretisieren kann. Templates sind keine Klassen oder Funktionen, die gelinkt werden könnten, sondern Baupläne für Klassen oder Funktionen - Vorlagen, halt.

Das hat zur Folge, dass Templates üblicherweise vollständig in den Header gehen. Mit expliziter Konkretisierung kann man Templates für ausgesuchte Fälle linken, weil sie dann quasi schon vorkonkretisiert sind, aber um den generischen Charakter vollständig zu erhalten, muss der Compiler die komplette Definition kennen. Das .hpp/.cpp-System wird damit keinesfalls sinnlos, aber Templates bilden nunmal keine eigene Übersetzungseinheit.

Manchmal findet man "aufgetrennte" Templates in der Form, dass der Header ein #include auf die Methodenvorlagendefinitionen hat; GNUs libstdc++ zum Beispiel trennt sie auf in .h und .tcc, wobei die .h dann am Ende ein #include "foo.tcc" hat. Nichtsdestoweniger müssen die Definitionen aber zur Compilezeit vorhanden und eingebunden sein.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
20.01.2009, 21:14 Uhr
Suba Esel



Aaah, okay. Danke fuer die Erklaerung!
Mit "sinnlos" meinte ich, dass bei einer reinen Template-Klasse (Klassen-Template? Was ist noch mal korrekt?) der gesamte Code in der .hpp stehen wuerde, also ueberhaupt keine .cpp mehr existieren wuerde.

Noch eine weitere Frage - gibt es einen Unterschied zwischen template <typename T>
class TemplateTest und template <class T> class TemplateTest?
--
Simon
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
20.01.2009, 21:32 Uhr
0xdeadbeef
Gott
(Operator)


Class template oder Klassenvorlage. Eine Klassenvorlage ist ja noch keine Klasse.

Manchmal wird eine Konkretisierung einer class template als "template class" bezeichnet, z.B. std::vector<int>. In ähnlicher Weise werden Konkretisierungen von function templates (Funktionsvorlagen) manchmal als template functions bezeichnet, z.B. std::tolower<char>.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
20.01.2009, 23:36 Uhr
~Suba Esel
Gast


Ok, das macht Sinn.
Bis zur naechsten Frage... (Ich schreibe grade "just for fun" eine Listenklasse, um mir Templates naeherzubringen, daher das Ganze.)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ 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: