Что означает «отсутствующий аргумент шаблона»? - PullRequest
12 голосов
/ 08 февраля 2012

Я довольно новичок в C ++ и на этом сайте, так что обязательно будут ошибки.Когда я пытаюсь скомпилировать свой код, я получаю сообщения об ошибках типа error: missing template argument before 'b'.Я часами искал в мире ответы, и это привело меня сюда.

Мое задание - реализовать шаблонный класс Collection, который хранит коллекцию объектов с использованием массива вместе с текущим размеромколлекция.

    #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 ]

18 голосов
/ 08 февраля 2012

Вы должны сказать, что это коллекция.

template <class A> class collection {}

требует, чтобы вы использовали его как

collection<int> b;

или какой-то подходящий тип. Это тогда делает коллекцию целых. Вы не сказали, что вы хотите коллекцию.

6 голосов
/ 08 февраля 2012

Первый : создание шаблона по типу. Так что если у вас есть 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".

Надеюсь, это поможет.

2 голосов
/ 08 февраля 2012

Ну, вам не хватает аргумента шаблона. Вы не можете создать объект collection, это просто шаблон.

Вы можете создать только, например, collection<int> или collection<std::string>.

1 голос
/ 08 февраля 2012

Вам необходимо указать тип шаблона, например int или другой тип:

collection<int> b; 
0 голосов
/ 08 февраля 2012

В вашем коде большое количество ошибок. Сначала определите ваш шаблон в заголовочном файле:

В 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 вы можете использовать другой тип, но суть в том, что вам нужен TYPE для создания экземпляра шаблона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...