Frage zu Fehlerhafeten Code?



  • BorisDieKlinge schrieb:

    wo muss ich denn:
    typename std::list<Elem>::iterator it;

    eintragen?

    Wenn du es dort brauchst, an der Stelle, an der der Fehler gemeldet wurde.

    gehört das "it" überhautp da hin?

    Gegenfrage: Was für eine Aufgabe hat dieser Iterator überhaupt?



  • der zeigt später auf das letze kind- Elem !



  • BorisDieKlinge schrieb:

    EDTI: was muss ich in sonem fall machen:

    typename davorsetzen. 😃



  • 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.


  • Mod

    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;
    };
    

Anmelden zum Antworten