2012-02-08 12 views
11

Soy bastante nuevo en C++ y en este sitio, por lo que es probable que haya errores. Cuando intento compilar mi código, recibo errores como error: missing template argument before 'b'. He estado buscando respuestas por horas en el mundo y me ha llevado hasta aquí.¿Qué significa "argumento de plantilla faltante"?

Mi tarea es implementar una colección de clases con plantillas que almacena una colección de objetos usando una matriz, junto con con el tamaño actual de la colección.

#include <iostream> 
    #include "collection.h" 

    using namespace std; v 

    int main(int argc, char* argv[]) 
    { 
     collection b; //<----error missing template argument before 'b' 
     return 0; 
    } 

#ifndef COLLECTION_H 
    #define COLLECTION_H 

    #include <iostream> 

    template <typename obj> 
    class collection 
    { 
    public: 
     collection(); 
     bool isEmpty() const; 
     void makeEmpty(); 
     void insert(obj val); 
     void remove(obj val); 
     bool contains(obj val) const; 
    private: 
     size_t size; 
     obj* col[]; 
    }; 

    #endif 

#include "collection.h" 

    template <typename obj> 
    collection<obj>::collection() :size(10) 
    { 
     col = new obj*[size]; 
    } 

    template <typename obj> 
    bool collection<obj>::isEmpty() const 
    { 
     for(size_t k = 0; k < size; k++) 
     { 
      if(col[k] != NULL) 
       return false; 
     } 
     return true; 
    } 

    template <typename obj> 
    void collection<obj>::makeEmpty() 
    { 
     for(size_t k = 0; k < size; k++) 
     { 
      col[k] = NULL; 
     } 
    } 

    template <typename obj> 
    void collection<obj>::insert(obj val) 
    { 
     int temp = 0; 
     for(size_t s = 0; s < size; s++) 
     { 
      if(col[s] != NULL) 
       temp++; 
     } 
     if(temp >= size) 
     { 
      obj* temp = new obj*[size*2]; 

      for(size_t c = 0; c < size; c++) 
       temp[c] = col[c]; 

      delete col; 
      col = temp; 
     } 
     else 
      col[temp] = val; 
    } 

    template <typename obj> 
    void collection<obj>::remove(obj val) 
    { 
     for(size_t x = 0; x < size; x++) 
     { 
      if (col[x] == val) 
      { 
       for(size_t y = x; y < size-1; y++) 
       { 
        col[y] = col[y+1]; 
       } 
       col[size-1] = NULL; 
       return; 
      } 
     } 
    } 

    template <typename obj> 
    bool collection<obj>::contains(obj val) const 
    { 
     for(size_t z = 0; z < size; z++) 
     { 
      if(col[z] == val) 
       return true; 
     } 
     return false; 
    } 
+5

Bienvenido a SO. Esta es una primera pregunta bastante buena, pero en el futuro intente publicar solo un conjunto mínimo de código que aún muestre el problema. En este caso, no tuvimos que leer todo el contenido de la plantilla de la clase 'collection' para descubrir qué era lo que estaba mal. A menudo, creo que encontrarás que pasar por el trabajo de minimizar el código en tu pregunta te llevará a la respuesta incluso antes de publicarla. :-) –

+2

Tom, Mat y Bojan están bien acerca de su pregunta inmediata. Una vez que hayas solucionado eso, tendrás un problema con ese tercer archivo: para crear una instancia del objeto 'collection ' en 'main', el compilador necesitará ver el constructor. Si eso está en un archivo separado, no funcionará. Es común dejar la implementación en el encabezado, pero si no lo hace, es posible que deba '#incluir' el tercer archivo en lugar de compilarlo normalmente. – Useless

Respuesta

1

Bueno, te falta un parámetro de plantilla. No puede crear un objeto collection, eso es solo una plantilla.

Solo puede crear, p. a collection<int> o collection<std::string>.

13

Tienes que decir de qué se trata.

template <class A> class collection {} 

requiere que se utilice como

collection<int> b; 

o algún tipo apropiado. Eso luego hace una colección de enteros. No le has dicho de qué quieres una colección.

+0

quiero una colección de objetos. Traté de poner lo que dijiste y todavía me da el error "referencia indefinida a" colección :: colección() '". No necesito pasarle nada al constructor. cada tipo de datos que uso en lugar de todavía me da el mismo error. – Josh

+0

ver el comentario de @Inútil sobre la pregunta –

1

es necesario especificar el tipo de plantilla, como int o algún otro tipo:

collection<int> b; 
0

hay un gran número de errores en el código. En primer lugar definir su plantilla en un archivo de cabecera:

En collection.h colocamos los siguientes:

#ifndef COLLECTION_H 
#define COLLECTION_H 

    template <typename obj> 
    class collection 
    { 
    public: 
     collection() {} 
     bool isEmpty() const; 
     void makeEmpty(); 
     void insert(obj val); 
     void remove(obj val); 
     bool contains(obj val) const; 
    private: 
     size_t size; 
     obj* col[]; 
    }; 

#endif 

Luego, en un archivo .cpp dentro de una función principal, haga lo siguiente:

collection<int> b; 

lugar de int puede usar un tipo diferente pero el punto principal es que USTED NECESITA UN TIPO para instanciar una plantilla.

5

Primero: crear una instancia de la plantilla por tipo. Así que si usted tiene template <typename obj> class T {...}; que se debe utilizar como

void main { 
    T<int> t; 
    T<bool> t1; // .. etc 
} 

Puede utilizar una plantilla con un valor por defecto para el parámetro de nombre de tipo definido en la declaración de plantilla de clase

template <typename obj = int> class T {/*...*/}; 

void main { 
    T<> t; 
} 

pero de todos modos se debe poner entre paréntesis angulares vacías cuando lo usas sin parámetro.

Segundo: Al declarar la plantilla, colóquela en el archivo de encabezado. Cada definición de sus métodos debe estar en el archivo "* .h", no me preguntes por qué, simplemente no lo dividas en el encabezado y el archivo "cpp".

Espero que ayude.

Cuestiones relacionadas