2010-03-29 15 views

Respuesta

14

En g ++. siempre que sea en una plantilla que se ve el error:

error: expected ';' before 'it' 

sospechan que necesita un nombre de tipo:

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

Esto es necesario cuando se encuentra en una plantilla que tiene un nuevo tipo declarado (en este caso el iterador de la lista) que depende de uno o más de los parámetros de plantilla. La necesidad no es exclusiva de g ++ BTW, es parte de C++ estándar.

+0

@anon: Do by change tiene una lista de casos donde el typename es obligatorio. Cheers (+1) – ezdazuzena

9

Neil le ha dado su respuesta. Dicho esto, es posible que desee hacer una serie de typedef y utilizando aquellos, por lo que su trabajo no se convierta en tan tedioso (y que aumenta la legibilidad):

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 
    } 
}; 

Es bastante común que sean liberales con su uso de typedef .

Además, heredar de un contenedor estándar puede ser una mala idea, ya que en realidad no están hechos para tal cosa. Por ejemplo, una función gratuita suele ser best choice si está buscando extensiones para un contenedor.

+0

Gracias. Esto definitivamente me dio más información. –

+0

Gracias por este pequeño articulo, me ha ayudado mucho! –

Cuestiones relacionadas