std::list mit Templateklasse
-
Moin moin
ich möchte in eine Liste Objekte einer Templateklasse einfügen und mittels Iterator durch die Liste wandern.
template <class T> class PacketIdentifier { public : PacketIdentifier (const T& element); T element; }; template <class T> class FilterPacketIdentifier { private : typedef std::list< PacketIdentifier<T> > TPacketIdentifierList; TPacketIdentifierList list; TPacketIdentifierList::iterator iter; };Das Ersellen des Listenobjekts funktioniert auch, nur für den Iterator bekomme ich vom Kompiler diese Fehlermeldung:
filter_packet_identifier.h:71: Fehler: Typ »std::list<PacketIdentifier<T>, std::allocator<PacketIdentifier<T> > >« ist nicht vom Typ »FilterPacketIdentifier<T>« abgeleitet
Weiß jemand, was das bedeutet?
cu
Thundernail
-
typename TPacketIdentifierList::iterator iter;
-
Danke, funktioniert.
Ich kann zwar nicht ganz nachvollziehen, warum das 'typename' hilft,...
Danke
Thundernail
-
Thundernail schrieb:
Danke, funktioniert.
Ich kann zwar nicht ganz nachvollziehen, warum das 'typename' hilft,...
Danke
ThundernailIst einer der 2 "template-Klassiker" (der andere ist "Implementation-gehört-in-den-Header")
Beispiel:
namespace TPacketIdentifierList { int iterator; }; // Was bedeutet nun das hier: TPacketIdentifierList::iterator // ... ?Sprich: Der Compiler kann nicht wissen, ob es sich bei dem Konstrukt "A::B" um einen Typen oder eine Variable handelt (selbst wenn A eine Klasse ist, kann B ein static-Member sein) ... deswegen geht er von einer Variable aus, es sei denn, man sagt ihm, dass es anders ist (und dafür gibt's das Schlüsselwort typename).
Vielleicht wäre es auch klarer, wenn Du den weitverbreiteten Ratschlag beherzigen würdest und Templatedeklarationen mit
template <typename ...>schreiben würdest.
Gruß,
Simon2.
-
Simon2 schrieb:
Sprich: Der Compiler kann nicht wissen, ob es sich bei dem Konstrukt "A::B" um einen Typen oder eine Variable handelt (selbst wenn A eine Klasse ist, kann B ein static-Member sein) ... deswegen geht er von einer Variable aus, es sei denn, man sagt ihm, dass es anders ist (und dafür gibt's das Schlüsselwort typename).
eigentlich geht es bei typename nur darum, compiler-gerechten code zu schreiben. wenn der parameter nämlich tatsächlich einen typ und eine variable mit demselben namen hat, hilft auch kein typename mehr.
-
Danke für die Erklärung.
