C++ Clases y templates

ItNaS

Hola, estoy empezando a mirarme clases y templates en c++ y para practicar me queria montar mi propia clase stack, el caso es que no me acaba de salir. No se si es que lo estoy haciendo mal en la forma de separar el header o que :S

esto es lo que he hecho

stack.h
stack.cpp
stacktest.cpp

Al compilar stacktest.cpp me da los siguientes errores

stacktest.cpp: In function ‘int main()’:
stacktest.cpp:7: error: ‘template<class T> class stack’ used without template parameters
stacktest.cpp:7: error: expected primary-expression before ‘int’
stacktest.cpp:7: error: expected `;' before ‘int’
stacktest.cpp:8: error: ‘newstack’ was not declared in this scope

muchas gracias :)

dr_Rouman

#1

Llevo MUCHO sin programar en C++, pero creo veo unos cuantos fallos más allá de eso que has puesto...

Por ejemplo, el constructor debería ser stack<T>::stack() y push no devuelve nada cuando en la definición sí. Y count debería tener template <class T> arriba si mal no recuerdo.

No sé cómo te compila stack.cpp de hecho xD

Tengo las plantillas un poco verdes, pero además creo que te ponían pegas si separabas declaración de plantillas de implementación. No estoy seguro, de todas formas.

Luego en el main creo que en cualquier caso tendrías que invocar al constructor no? Y no tiene sentido que llames a stack::stack<int>, el primer stack:: sería un namespace (que no has definido). Vamos que debería ser stack<int> mystack(); o algo así

1
SicKneSs

#1 yo también llevo muchísimo sin tocar C++ y pensaba tambíen que el fallo estaba en el constructor por no usar paréntesis, pero he mirado ahora y cuando el constructor no recibe parámetros se deben de quitar.

1 2 respuestas
dr_Rouman

#1, #3 Cierto! Pues cambiando esos detalles que he dicho compila.

edit: además, el stackNode * next no tiene tipo, debería ser stackNode<T> creo

1 1 respuesta
Gusete

Como ya han sugerido #3 y #4, se te ha olvidado "templatizar" la implementacion del constructor y por eso te da el error:

template <class T> stack<T>::stack() : nelems(0){}

Ademas, como dicen #3 y #4, la definicion de un template debe de "estar a mano del compilador", lo que se hace habitualmente es tener la definicion en el mismo sitio que la declaracion (o bien dentro de la misma clase o despues de la declaracion). Hay tecnicas para tener separada la definicion de la declaracion en los templates. En este libro te explican practicamente todo lo que hay que saber de templates: http://www.josuttis.com/tmplbook/

Por cierto, echale un ojo al manejo de la memoria de la pila (push guardando la direccion de una variable automatica!) que cuando consigas que te compile, seguramente te pete :D y cuidado con el constructor copia, el operador asignacion y el destructor que el compilador crea por defecto.

Si quieres profundizar mas, despues de eso, querras saber sobre "exception safety" y porque tu implementacion de pila pierde memoria en caso de una excepcion. En ese caso te deberias de leer los apartados de excepciones de estos dos libros: http://www.amazon.co.uk/Exceptional-C-Herb-Sutter/dp/0201615622 y http://www.amazon.co.uk/More-Exceptional-Engineering-Programming-Solutions/dp/020170434X

1

Usuarios habituales

  • Gusete
  • dr_Rouman
  • SicKneSs
  • ItNaS