Wozu "class" in boost::shared_ptr?
-
Das ist eine forward declaration als Templateparameter.
Bei folgendem Code ist es aber völlig sinnlos, weil du sowieso eine vollständige Deklaration der Klasse brauchst, um Speicher anfordern zu können.
boost::shared_ptr</*class */Node> neu(new Node(12));
Grüssli
-
Die Deklaration der Klasse habe ich schon, die hab ich hier nur nicht gepostet weils die IMHO nicht braucht.
Hast du ein Beispiel, wo's das class braucht?
forward declaration als Templateparameter:
D.h. damit die Templateklasse (hier shared_ptr) meine übergebene Klasse (hier Node) kennt?
-
#include <iostream> template <typename T> class Test1 { }; int main() { Test1<class Test2> test; } class Test2 { };
Aber eigentlich macht man sowas nicht und ich hab sowas auch noch nie in einem Code gesehen.
-
Ich meine ein Beispiel mit einem shared_ptr, wo das class beim Templateargument angegeben wird.
-
Könnte nicht sowas ein Anwendungsfall sein?
boost::shared_ptr<class MyClass> ptr; class MyClass { // ... }; ptr.reset(new MyClass());
-
Yarrow schrieb:
...
Meinste das wird bei shared_ptr anders sein...
-
Wenn ich eine eigene Templateklasse programmiere, schreibe ich da ... "<typename T>", wobei früher "<class T>" verwendet wurde. Daher sollte also "typedef boost::shared_ptr<class T>" auf's selbe rauskommen wie "boost::shared_ptr<typename T>".. Mit typename läuft's aber nicht, daher denke ich, dass da schon was anders läuft.
-
Mit typename funktioniert es nicht ? Und was hab ich in meinem Beispiel gemacht?
-
Darum sag ich ja, dass dein Beispiel mein Problem nicht löst. Hättest du's ausprobiert, hättest du's auch gemerkt.
typedef boost::shared_ptr<class Node> NodePtr; <<-- Funktioniert
typedef boost::shared_ptr<typename Node> NodePtr; <<-- Funktioniert NICHT
-
weil typename auch nicht dafür da ist...
das class dort wird aber einfach als forward-declaration interpretiert - und somit geht da alles klar...
bb
-
Ehm, es tut mir ja leid, aber erkennst du den unterschied wirklich nicht?
template<typename T> // (1) class Test0 { }; template<class T> // (2) class Test1 { }; int main() { Test0<class Foo> var; // (3) }
(1) Klassentemplate-Deklaration
(2) Klassentemplate-Deklaration
(3) Variablendefinition mit Forward Declaration von der KlasseFoo
.Eine vorwärts deklaration wird nunmal mit
class
gemacht. Die vorwärts Deklaration hat auch nichts mit Templates zu tun. Sie wird in diesem Fall einfach gleich als Templateparameter angegeben. Man könnte (3) auch anders schreiben:class Foo; // vorwärts Deklaration vorgelagert. int main() { Test0<Foo> var; // (3) }
Grüssli