Codificación iterador función para la clase STL
-
28-09-2019 - |
Pregunta
Estoy trabajando a través de algún código C ++ de "Instrumento Financiero Precios Usando C ++" - un libro sobre la valoración de opciones usando C ++. Siguiente código es un pequeño fragmento despojado de muchos detalles que básicamente intentos de definir una clase SimplePropertySet
que está destinado a contener un nombre y una 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
}
En la elaboración de este código en VS2008, que obtienen los siguientes errores:
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
¿Hay algo estúpido o básico que me estoy haciendo mal o olvidar aquí? ¿Es un error de sintaxis? Soy incapaz de poner mi dedo en la llaga. El libro del que este fragmento de código se toma dice que su código fue compilado en Visual Studio 6. ¿Es esto una cuestión relacionada con la versión?
Gracias.
Solución
Tal como se indica por el compilador, debe reemplazar:
template <class N, class V>
SimplePropertySet<N,V>::iterator SimplePropertySet<N,V>::Begin()
por:
template <class N, class V>
typename SimplePropertySet<N,V>::iterator SimplePropertySet<N,V>::Begin()
este vínculo de una explicación sobre los nombres de dependientes.