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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top