Что означает "отсутствующий аргумент шаблона"?
Я новичок в С++ и на этом сайте, поэтому обязательно будут ошибки. Когда я пытаюсь скомпилировать свой код, я получаю ошибки типа error: missing template argument before 'b'
. Я много часов искал ответы на вопросы, и это привело меня сюда.
Мое назначение - реализовать шаблонную коллекцию классов, в которой хранится коллекция Объекты, использующие массив, вдоль с текущим размером коллекции.
#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;
}
Ответы
Ответ 1
Вы должны сказать, что это коллекция.
template <class A> class collection {}
требует, чтобы вы использовали его как
collection<int> b;
или какой-либо подходящий тип. Тогда создается коллекция ints. Вы не сказали, что хотите получить коллекцию.
Ответ 2
Первый. Создайте шаблон по типу. Поэтому, если у вас есть template <typename obj> class T {...};
, вы должны использовать его как
void main {
T<int> t;
T<bool> t1; // .. etc
}
Вы можете использовать шаблон со значением по умолчанию для параметра typename, определенного в объявлении шаблона класса
template <typename obj = int> class T {/*...*/};
void main {
T<> t;
}
но в любом случае вы должны ставить пустые угловые скобки, когда используете его без параметров.
Второй. При объявлении шаблона поместите его целиком в файл заголовка. Каждое определение его методов должно быть в файле "*.h", не спрашивайте меня, почему бы просто не разделить его на заголовок и файл "cpp".
Надеюсь, что это поможет.
Ответ 3
Ну, вам не хватает аргумента шаблона. Вы не можете создать объект collection
, просто шаблон.
Вы можете создавать только, например. a collection<int>
или collection<std::string>
.
Ответ 4
Вам нужно указать тип шаблона, например int
или какой-либо другой тип:
collection<int> b;
Ответ 5
В коде содержится большое количество ошибок. Сначала определите свой шаблон в файле заголовка:
В collection.h введите следующее:
#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
Затем в файле .cpp внутри основной функции выполните следующее:
collection<int> b;
Вместо int вы можете использовать другой тип, но главное, что вам нужно ТИП для создания шаблона.