Frage zu Fehlerhafeten Code?
-
In dem Fall brauchst du ihn wohl tatsächlich als Klassenmember. Und das 'typename' mußt du im Zweifelsfall überall angeben, wo du den Iterator-Typ benötigst.
(wenn dir das zu viel Schreibarbeit ist, verwende einen typedef:
class Elem { typedef typename std::list<Elem>::iterator EListIt; EListIt it; public: EListIt test(); ... };
-
jepp hab ich probiert, aber wenn ich de funktion in cpp kapsle
std::list<DataX::Elem>::iterator DataX::Elem::test(){ }und in head
typename std::list<Elem>::iterator test();stehen habe kommt:
c:\test\template\DataX.cpp(11): error C2143: syntax error : missing ';' before 'DataX<T>::Elem::test'
-
BorisDieKlinge schrieb:
jepp hab ich probiert, aber wenn ich de funktion in cpp kapsle
std::list<DataX::Elem>::iterator DataX::Elem::test(){ }und in head
typename std::list<Elem>::iterator test();stehen habe kommt:
c:\test\template\DataX.cpp(11): error C2143: syntax error : missing ';' before 'DataX<T>::Elem::test'
template<class T> typename std::list< DataX<T>::Elem >::iterator DataX::Elem::test()So?
Im Rückgabetyp ist dem Compiler noch nicht bekannt, dass Du für das Template DataX schreibst, also musst Du explizit DataX<T> angeben. In der Deklaration ist DataX eine Kurzschreibweise für DataX<T>.
-
Erstens solltest du bei der Definition auch angeben, daß es sich um ein Template handelt. Und zweitens gehören Template-Funktionen direkt in den Header (den Compiler stört's zwar nicht, aber deinem Linker wird es nicht gefallen, wenn du "de funktion in cpp kapsle"st)
-
in dem fall kommt:
c:\test\template\DataX.cpp(14): error C2244: 'DataX<T>::Elem::test' : unable to match function definition to an existing declaration
-
template<class T> typename std::list< DataX<T>::Elem >::iterator DataX< T >::Elem::test()Außerdem muss die Definition auch mit in den Header.
-
da fehlt noch ein typename:
template<class T> typename std::list< typename DataX<T>::Elem >::iterator DataX< T >::Elem::test()
-
d.h. ich soll in dem fall auf kapselung von header und Cpp verzichten, und den ganzen Code in der header einbinden?
-
BorisDieKlinge schrieb:
d.h. ich soll in dem fall auf kapselung von header und Cpp verzichten, und den ganzen Code in der header einbinden?
Du musst. Es sei denn du verwendest einen Compiler der Templateexport unterstützt.
-
Wenn du mit Templates arbeiten willst, bleibt dir wohl nichts anderes übrig. (die Alternative besteht darin, auf Templates zu verzichten - was ist dir lieber?)
-
hmmm ich könnte CAllocNode Knoten auch ohne parameter verwalten, und dann klassen davon ableiten welche dann parameter enthalten mit denen gearbeiten wird?
class Allocation{ . . . class AllocNode{ //Knoten verwaltung daten und funktionen Grimsgrams }; . . }; class DATEN : public Allocation::AllocNode{ double Start; double Dauer; };