Forwarddeclaration von inneren templateklassen



  • Hallo,
    ich habe eine Templateklasse (bin_tree), die eine Innere Template-Klasse (element) besitzt ich möchte jedoch auch, dass die innere klasse ein template ist.

    template <class T>
    class bin_tree{
        public:
            typedef T data_type;
        private:
            template <class U>
            class element{
                public:
                    element();
                private:
                    U data;
                    std::shared_ptr<element> left;
                    std::shared_ptr<element> right;
                    std::shared_ptr<element> parent;
            };
            typedef element<data_type> elem;
            elem root;
    };
    

    diese sache kompiliert auch schön.

    zwecks der übersicht würde ich gerne die innere klasse element aus der oberklasse rausnehmen.

    template <class T>
    class bin_tree{
        public:
            typedef T data_type;
        private:
            template <typename U>
                class element;  //forward declaration von tree-element
            typedef element<data_type> elem;
            elem root;
    };
    
    template <class T>
    class bin_tree<T>::element{
        public:
            typedef T data_type;
        private:
            data_type data;
            std::shared_ptr<element> left;
            std::shared_ptr<element> right;
            std::shared_ptr<element> parent;
    };
    

    dazu bekomme ich folgende fehlermeldung:

    In file included from bsp2.cpp:2:0:
    bin_tree.h:17:20: error: too few template-parameter-lists
    bin_tree.h: In instantiation of ‘class bin_tree<int>’:
    bsp2.cpp:6:19:   required from here
    bin_tree.h:13:14: error: ‘bin_tree<T>::root’ has incomplete type
    bin_tree.h:11:19: error: declaration of ‘bin_tree<int>::elem {aka class bin_tree<int>::element<int>}’
    In file included from bin_tree.cpp:1:0:
    bin_tree.h:17:20: error: too few template-parameter-lists
    In file included from bin_tree_element.h:5:0,
                     from bin_tree_element.cpp:1:
    bin_tree.h:17:20: error: too few template-parameter-lists
    

    Hat jemand eine idee, wie das geht?

    und ja ich weiß es gibt auch schon die fix fertigen bibliotheken für die binären bäume. ich muss es aber für die uni in c++ implementieren.

    lg + danke



  • Edit: Mist entfernt



  • hallo gnihihihihi, danke für die antwort, aber wenn ich richtig informiert bin regeln die friends ja nur die zugriffsrechte. das ist aber leider nicht das was ich will.

    wie gesagt ich will ja nicht die klasse elememt an sich rausziehen, sondern nur die definition im header. zwecks übersichtlichkeit (also kosmetisch)

    im endeffekt sollte die klasse element trotzdem eine innere klasse von bin_tree sein, obwohl sie draußen steht.

    ich will sie auch nicht als friend deklarieren, denn ich will sowieso nur über bestimmte methoden die ich public setze drauf zugreifen.

    lg.



  • So:

    template<typename T>
    class B{
    public:
        template<typename X>
        class A;
    };
    
    template<typename T>
    template<typename X>
    class B<T>::A{
    };
    


  • gnihihihihi Du bist der beste...

    dankeschön. 🙂

    allein wär ich da nie draufkommen.
    wo schaust du da nach, bzw. wie bist du auf das gekommen?



  • erdbeergulasch schrieb:

    [...]wie bist du auf das gekommen?

    Indem ich deinen Beitrag nochmal gelesen habe 🤡
    Hab manchmal Bierdeckel vor den Augen 😛

    Dein Compiler sagts eigentlich schon:

    error: too few template-parameter-lists
    

    Da es sich um eine Template-Klasse innerhalb einer Template-Klasse handelt müssen auch zwei Template-Parameter verwendet werden.

    Edit: Trotzdem bin ich der Meinung, dass die innere Klasse kein Template sein sollte. Du gibst ja schon im bin_tree an mit welchem Typen du schlussendlich arbeiten willst, da fände ich z.b. ein bin_tree<int>::element<float> äußerst unlogisch.
    Oder was willstn mit dem zweiten Template-Parameter anfangen?



  • Ja, ich hab die Fehlermeldung auch so interpretiert, dass noch ein parameter fehlt, aber ich habe ständig sowas geschrieben und mich gewundert warums nicht geht...

    template <typename T, typename U>
    class bin_tree<T>::element{
    ...
    }
    


  • Du schreibst ja auch nicht:

    template <typename T>
    class foo
    {
    public:
        template <typename U>
        void bar();
    };
    
    template <typename T, typename U>
    void foo<T>::bar()
    {
    
    }
    

Anmelden zum Antworten