 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Babak Pourat Guest
|
Posted: Mon Mar 07, 2005 9:21 am Post subject: template und inline |
|
|
Hallo,
Template-Definitionen stehen ja alle im H-File. Muss ich sie Deshalb als
inline Deklarieren? Sind sie implizit inline, oder besteht gar kein
zusammenhang?
Danke
Babak
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Stefan Reuther Guest
|
Posted: Mon Mar 07, 2005 10:20 am Post subject: Re: template und inline |
|
|
Babak Pourat wrote:
| Quote: | Template-Definitionen stehen ja alle im H-File. Muss ich sie Deshalb als
inline Deklarieren? Sind sie implizit inline, oder besteht gar kein
zusammenhang?
|
Hier besteht kein Zusammenhang. Wenn du sie nicht explizit als inline
definierst (bzw. dadurch inline machst, dass du die Memberfunktionen
einer Templateklasse innerhalb dieser Klasse definierst), sind sie nicht
inline.
Stefan
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Mon Mar 07, 2005 11:07 am Post subject: Re: template und inline |
|
|
Stefan Reuther wrote:
| Quote: | Babak Pourat wrote:
Template-Definitionen stehen ja alle im H-File. Muss ich sie Deshalb als
inline Deklarieren? Sind sie implizit inline, oder besteht gar kein
zusammenhang?
Hier besteht kein Zusammenhang. Wenn du sie nicht explizit als inline
definierst (bzw. dadurch inline machst, dass du die Memberfunktionen
einer Templateklasse innerhalb dieser Klasse definierst), sind sie nicht
inline.
|
Verhalten tun sie sich aber trotzdem so. inline bedeutet in C++, daß es von
der Funktion mehrere Definitionen geben (ich also die "one definition rule
verletzen" kann, ohne daß es zu Fehlern führt. Das gleiche glit auch für
Templates.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Daniel Albuschat Guest
|
Posted: Mon Mar 07, 2005 1:07 pm Post subject: Re: template und inline |
|
|
Babak Pourat wrote:
| Quote: | Hallo,
Template-Definitionen stehen ja alle im H-File. Muss ich sie Deshalb als
inline Deklarieren?
|
Nein, musst du nicht. Du kannst sie auch wie andere Klassen/Funktionen
in Deklaration und Definition aufteilen. Ich persoenlich benutze
das so gut wie nie, weil die Syntax der Definition je nach Komplexitaet
des Templates schonmal argh komisch werden kann.
Hier ist ein Beispiel fuer einen einfachen Fall:
#include <iostream>
// Klassendeklaration
template<typename T>
struct foo {
void bar();
};
// Methodendefinition
template<typename T>
void foo<T>::bar() {
std::cout << "foo
}
// Funktionsdeklaration
template<typename T>
void func();
// Funktionsdefinition
template<typename T>
void func() {
std::cout << "func
}
int main() {
foo<int> f;
f.bar();
func<int>();
}
Trotzdem kannst du aber nicht die Definitionen in eine .cpp Datei
Packen, das du nur dazulinkst. Wenn du Deklaration und Definition
in Dateien auftrennen willst, musst du ein #include <foo.def>
am Ende der .h einbauen. Hier weiss ich gerade nicht, was sich als
Namenskonvention fuer solche Implementierungsdateien eingebuergert hat,
aber irgend was gab's da.
MfG,
Daniel
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Stefan Reuther Guest
|
Posted: Mon Mar 07, 2005 5:19 pm Post subject: Re: template und inline |
|
|
Rolf Magnus wrote:
| Quote: | Stefan Reuther wrote:
Hier besteht kein Zusammenhang. Wenn du sie nicht explizit als inline
definierst (bzw. dadurch inline machst, dass du die Memberfunktionen
einer Templateklasse innerhalb dieser Klasse definierst), sind sie nicht
inline.
Verhalten tun sie sich aber trotzdem so. inline bedeutet in C++, daß es von
der Funktion mehrere Definitionen geben (ich also die "one definition rule
verletzen" kann, ohne daß es zu Fehlern führt. Das gleiche glit auch für
Templates.
|
Darauf ein klares "Jein".
Inline-Funktionen *müssen* in jeder Übersetzungseinheit definiert sein,
in der sie verwendet werden (3.2p3: "An inline function shall be defined
in every translation unit in which it is used.").
Templateklassen-Member *dürfen* in jeder Übersetzungseinheit definiert
sein, müssen aber nicht (3.2p5: "There can be more than one definition
of a ... class template (clause 14), nonstatic function template
(14.5.5), static data member of a class template (14.5.1.3), member
function template (14.5.1.1), or template specialization ...")
Demzufolge kann z.B. eine Übersetzungseinheit so aussehen:
----8<--------8<--------8<--------8<--------8<----
#include
template<class T>
struct foo {
foo();
};
template<class T>
foo<T>::foo()
{
std::cout << "hi.n";
}
template struct foo
----8<--------8<--------8<--------8<--------8<----
und eine andere so:
----8<--------8<--------8<--------8<--------8<----
template
struct foo {
foo();
};
int main()
{
new foo<int>;
}
----8<--------8<--------8<--------8<--------8<----
Hier ist der Konstruktor foo
muss er nicht in jeder Übersetzungseinheit definiert werden, solange
alle benötigten Spezialisierungen irgendwo explizit (wie hier) oder
implizit generiert werden.
Wenn der Konstruktor inline ist, muss er natürlich wieder überall
definiert sein.
Stefan
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Daniel Albuschat Guest
|
Posted: Mon Mar 07, 2005 7:43 pm Post subject: Re: template und inline |
|
|
Stefan Reuther wrote:
| Quote: | int main()
{
new foo<int>;
}
|
Dann mach wenigstens
| Quote: | delete new foo<int>;
|
(wieso eigentlich new? Hat das einen bestimmten Grund?)
Wir wollen ja kein schlechtes Vorbild liefern. :)
Tschau,
Daniel
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|