2010-03-29 6 views

risposta

14

In g ++. ogni volta in un modello che si vede l'errore:

error: expected ';' before 'it' 

sospetta hai bisogno di una typename:

typename std::list<T>::iterator it; 

Ciò è necessario quando in un modello che dispone di un nuovo tipo dichiarato (in questo caso la lista iteratore) che dipende da uno o più parametri del modello. La necessità non è esclusiva di g ++ BTW, è parte dello standard C++.

+0

@anon: Do by change ha un elenco di casi in cui il nome di tipo è obbligatorio. Cheers (+1) – ezdazuzena

9

Neil ti ha dato la tua risposta. Detto questo, si potrebbe desiderare di fare una sfilza di typedef e di usare quelli, in modo che il lavoro non diventi così noioso (e aumenta la leggibilità):

template <typename T> 
class myList : public std::list<T> 
{ 
public: 
    typedef T value_type; 
    typedef const T const_value_type; 
    typedef value_type& reference; 
    typedef const_value_type& const_reference; 
    typedef value_type* pointer; 
    typedef const_value_type* const_pointer; 

    typedef std::list<T> base_container; 
    typedef typename base_container::iterator iterator; 
    typedef typename base_container::const_iterator const_iterator; 

    void foo() 
    { 
     iterator it; // easy peasy 
    } 
}; 

E 'abbastanza comune per essere liberale con l'uso di typedef di .

Inoltre, ereditare da un contenitore standard potrebbe essere una cattiva idea, dal momento che non sono fatti apposta per una cosa del genere. Ad esempio, una funzione gratuita è spesso la best choice se stai cercando alcune estensioni in un contenitore.

+0

Grazie. Questo definitivamente mi ha dato un po 'più di intuizione. –

+0

Grazie per questo simpatico articolo, mi ha aiutato molto! –

Problemi correlati