Wozu "class" in boost::shared_ptr?



  • Hallihallo

    Wenn ich boost::shared_ptr verwende, wozu muss ich dann "class" vor den Typ des Pointers schreiben?

    boost::shared_ptr<[b]class[/b] Node> neu(new Node(12));
    

    Ich hab's mal ohne probiert und es scheint zu funktionieren, an den meisten Stellen in den Unterlagen die ich habe, wird's aber mit "class" gemacht, wird also schon seine Gründe haben, denke ich.

    Wäre nett, wenn mir jemand helfen kann. 🙂



  • Musst du nicht, und das hat nichts mit shared_ptr zu tun.

    In C musste man bei Strukturen jeweils ein struct zu der Deklaration hinschreiben:

    struct MyStruct
    {
        int i;
        double d;
    };
    
    struct MyStruct Obj;
    

    In C++ ist das unnötig. Bei class das Gleiche, das kam zwar erst in C++, aber ist auch erlaubt.


  • Administrator

    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


  • Administrator

    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 Klasse Foo .

    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


Log in to reply