Template Definition scheitert - Warum?



  • Hi,

    ich habe ein kleines Problem bei einem Template.

    Ich habe eine Template-Klasse A, die nutzt std::list und hat intern ein struct namens B, der public ist.

    Wenn ich versuche die Definition

    template<class T>
    list<B> A<T>::getVertices(const T& x)
    [
    

    zu schreiben, streikt der Compiler. Auch

    template<class T>
    list<A<T>::B> A<T>::getVertices(const T& x)
    [
    

    wird verweigert.

    Wo liegt der Fehler? 😕



  • wenn du das template um die klasse hast und das ganze inline definierst, musst du nicht nochmal den template parameter wiederholen

    beispiel:

    template<typename T>
    class A
    {
        // template<typename T> wäre hier falsch, falls es der gleiche parameter sein soll
        std::list<T> returnList()
        { /* ... */ }
    };
    


  • Nein, die Definition ist außerhalb. Deklaration und Definition sind identisch, aber der COmpiler meint, sie wären nicht identisch.

    Keine Ahnung warum.

    Die Deklaration in der Klasse ist

    list<Vertex> getVertices(const T&);
    

    Die Definition ist

    template<class T>
    list<A<T>::B> A<T>::getVertices(const T& x
    


  • Sorry, meinte natürlich

    list<B> getVertices(const T&);
    


  • Wenn ich den struct B durch soetwas wie std::string oder int ersetze funktioniert alles.

    list<std::string> getVertices(const T&);
    
    template<class T>
    list<std::string> A<T>::getVertices(const T& x)
    

    Warum nimmt er den struct B aus Klasse A nicht an?

    template<typename T>
    class A
    {
    public:
        struct B { /* ... */ }
        std::list<B> getVertices(const T&);
        { /* ... */ }
    
    template<class T>
    list<A<T>::B> A<T>::getVertices(const T& x)
    

    😕


  • Administrator

    1. Wieso gibst du nicht die Fehlermeldung mit an? Das würde den Leuten sehr helfen, dir zu helfen.
    2. Meine Vermutung ist die folgende:

    template<class T>
    list<typename A<T>::B> A<T>::getVertices(const T& x)
    //   ^^^^^^^^
    

    Du musst dem Kompiler mitteilen, dass sich hinter B ein Typ versteckt. Da A von Templateparameter T abhängt, kann nicht klar festgestellt werden, ob B wirklich ein Typ ist. Daher muss das typename dort hin.

    Beim Rückgabewert ist man noch ausserhalb der Scopes, daher ist dies wahrscheinlich bei der Definition nötig, bei der Deklaration allerdings nicht, da man die Deklaration im Scope der Klasse schreibt.

    Grüssli



  • Das sieht nach nem Fehlenden typename aus.



  • typename A<T>::B



  • Danke an euch beide, ihr seid die Besten! Das wars. 🙂


Anmelden zum Antworten