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;
}
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. :-) –
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