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)
-
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
Bein Typ versteckt. DaAvon TemplateparameterTabhängt, kann nicht klar festgestellt werden, obBwirklich ein Typ ist. Daher muss dastypenamedort 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.
