Domanda su vettore iteratore nel template

Sto cercando di imparare la libreria STL e sto avendo uno strano problema. Questo codice viene compilato perfettamente:

void Show(vector<int> myvec)
{
    vector<int>::iterator it;
    cout << "Vector contains:";
    for( it = myvec.begin(); it < myvec.end(); it++) 
    {
         cout << " " << *it;
    }
    cout << endl;
}

mentre questo mi dà un messaggio di errore in fase di compilazione:

template <class T> 
void Show2(vector<T> myvec)
{
    vector<T>::iterator it;
    cout << "Vector contains:";
    for( it = myvec.begin(); it < myvec.end(); it++)
    {
         cout << " " << *it;
    }
    cout << endl;
}

L’errore è:

$ g++ hello.cpp
hello.cpp: In function void Show2(std::vector<T, std::allocator<_Tp1> >)’:
hello.cpp:19: error: expected ‘;’ before it
hello.cpp:21: error: it was not declared in this scope

Sembra un errore molto semplice, ma non riuscivo a trovare.

possibile duplicato di Dove mettere il “modello” e “typename” dipendente nomi
Probabile che abbia risposto molto prima, ma è difficile per la ricerca di typename/dipendente nomi se non sai che esistono tali termini
ecco un bel link e io probabilmente leggere subito. Ma, come @Erik ha detto che se non sai qual è il problema di fondo, ti cerca per molti termini specifici e non per il problema più generale. Ho fatto molte ricerche per gli iteratori, modelli, vettoriali, STL,… e non ha trovato niente, non ho ancora capito la parola chiave typename esisteva (:( sì, io sono un noob :P). Ho pensato che fosse solo uno stupido errore di sintassi.
Va bene, nessuno si lamenta 😉

OriginaleL’autore Rafael S. Calsaverini | 2011-03-04

5 Replies
  1. 25

    È bisogno di dire typename vector<T>::iterator it.

    In un’altra nota, si sta passando vectors per valore. Che significa che l’intera vector viene copiato nella chiamata di funzione. void Show(vector<T> const &myvec) e l’utilizzo di const_iterator sarebbe più saggio.

    Se passa un const ref, devi anche dirgli di usare const_iterator.
    assolutamente giusto, aggiornato il mio post.
    grazie per il suggerimento.

    OriginaleL’autore Fred Foo

  2. 16

    Avete bisogno di questo:

    typename vector<T>::iterator it;

    Questo indica al compilatore che vector<T>::iterator deve essere trattato come un tipo, qualcosa che non può assumere dal iterator dipende da ciò che T.

    OriginaleL’autore Erik

  3. 2

    Alcuni compilatori hanno problemi di rilevamento di quello che è il nome di un membro e qual è il nome del tipo, quando all’interno di modelli. Provare a scrivere qualcosa di simile a questo nella prima riga del modello corpo della funzione.

    typename vector<T>::iterator it;

    Corretto, ma non è davvero un problema del compilatore. Il C++ Standard impone che il compilatore trattare un nome dipendente in un modello come membro e non un tipo, a meno che typename è utilizzato.
    Non “alcuni compilatori”. La grammatica semplicemente non lo permette. “Alcuni compilatori” doppio indovinare programmatore ritentando con typename se l’analisi non riesce senza di essa, e quindi la compilazione di alcuni errato casi.
    Hai ragione. Punto presa!

    OriginaleL’autore CygnusX1

  4. 0

    Magari funziona utilizzando typename vector<T>::iterator it;
    Il compilatore non può sapere che c’è una classe interna iteratore.

    OriginaleL’autore frast

  5. 0

    In prima istanza il parametro, anche se si utilizza un modello, non è un modello, è una classe definita (vector<int>)

    In quest’ultimo caso il parametro è un modello di tipo T, e quindi richiede typename

    OriginaleL’autore CashCow

Lascia un commento