Coding iteratore funzione per la classe STL
-
28-09-2019 - |
Domanda
Sto lavorando con un certo codice C ++ da "strumento finanziario Pricing con C ++" - un libro sulla valutazione delle opzioni in C ++. A seguito di codice è un piccolo frammento spogliato di molti dettagli che sostanzialmente tenta di definire una classe SimplePropertySet
che è destinato a contenere un nome e la lista.
#include <iostream>
#include <list>
using namespace::std;
template <class N, class V> class SimplePropertySet
{
private:
N name; // The name of the set
list<V> sl;
public:
typedef typename list<V>::iterator iterator;
typedef typename list<V>::const_iterator const_iterator;
SimplePropertySet(); // Default constructor
virtual ~SimplePropertySet(); // Destructor
iterator Begin(); // Return iterator at begin of composite
const_iterator Begin() const;// Return const iterator at begin of composite
};
template <class N, class V>
SimplePropertySet<N,V>::SimplePropertySet()
{ //Default Constructor
}
template <class N, class V>
SimplePropertySet<N,V>::~SimplePropertySet()
{ // Destructor
}
// Iterator functions
template <class N, class V>
SimplePropertySet<N,V>::iterator SimplePropertySet<N,V>::Begin()//<--this line gives error
{ // Return iterator at begin of composite
return sl.begin();
}
int main(){
return(0);//Just a dummy line to see if the code would compile
}
Su compilazione di questo codice su VS2008, ottengo i seguenti errori:
warning C4346: 'SimplePropertySet::iterator' : dependent name is not a type
prefix with 'typename' to indicate a type
error C2143: syntax error : missing ';' before 'SimplePropertySet::Begin'
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
C'è qualcosa di stupido o di base che sto ottenendo sbagliato o dimenticare qui? Si tratta di un errore di sintassi? Non riesco a mettere il dito su di esso. Il libro da cui questo frammento di codice è preso dice che il loro codice è stato compilato su Visual Studio 6. E 'questa un'edizione Versione-correlato?
Grazie.
Soluzione
Come indicato dal compilatore, è necessario sostituire:
template <class N, class V>
SimplePropertySet<N,V>::iterator SimplePropertySet<N,V>::Begin()
con:
template <class N, class V>
typename SimplePropertySet<N,V>::iterator SimplePropertySet<N,V>::Begin()
questo link per un spiegazioni sui nomi dipendenti.