template will nicht kompilieren



  • Hallo
    Ich hab mir gerade eine Template-class geschrieben, aber der Compiler spuckt ganz oft diese beiden fehler aus:
    error: expected constructor, destructor, or type conversion before ‘&’ token
    error: expected constructor, destructor, or type conversion before ‘refQueue’

    Hier noch zwei von den betroffnen Funktionen:

    template<typename T>
    refQueue<T>::iterator &refQueue<T>::iterator::operator--()
    {
    	iterator temp(*this);
    
    	decRefCount();
    
    	mnode=mnode->mprev;
    
    	incRefCount();
    
    	return *this;
    }
    
    template<typename T>
    refQueue<T>::iterator refQueue<T>::begin()
    {
    	return iterator(&mbegin);
    }
    

    (Falls irgenjemand mehr van dem code sehen will kann ich ihn ja noch posten.)
    Danke!



  • Du hast die Funktionsdefinitionen nicht zufällig in der Sourcedatei?

    /Edit:
    Lösung ist Badestrands beitrag

    folgender Code funktioniert bei mir:

    template<typename TA> class refq {
      typedef TA* iterator;  
      int x;
      public:
        iterator &operator--();
    };
    
    template <typename TA> typename refq<TA>::iterator &refq<TA>::operator--() {
      --x;
    }
    


  • Probier doch mal, ein "typename" reinzuschmuggeln, so in etwa:

    template<typename T>
    typename refQueue<T>::iterator &refQueue<T>::iterator::operator--()
    


  • ja.
    Die Funktionen sind in einer Sourcedatei definiert.
    Die Template-Klasse hab ich in in einem Header, den ich mit #include"refqueue.h"
    included habe.
    Der sieht etwa so aus:

    template<typename T>
    class refQueue
    {
       struct node
       {/*  ...  */};
    public:
       class iterator
       { /*  ...  */};
    
       /* ein paar funktionen... */
    };
    


  • yrch schrieb:

    ja.
    Die Funktionen sind in einer Sourcedatei definiert.
    Die Template-Klasse hab ich in in einem Header, den ich mit #include"refqueue.h"
    included habe.

    sämtliche Templatedefinitionen müssen in den Header.



  • Badestrand schrieb:

    Probier doch mal, ein "typename" reinzuschmuggeln, so in etwa:

    template<typename T>
    typename refQueue<T>::iterator &refQueue<T>::iterator::operator--()
    

    Danke! das wars!!!


Log in to reply