“缺少模板参数”是什么意思?

时间:2012-02-08 14:57:35

标签: c++ templates

我对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 个答案:

答案 0 :(得分:18)

你必须说出它是什么的集合。

template <class A> class collection {}

要求您将其用作

collection<int> b;

或某种合适的类型。然后,它会收集整数。你没有告诉它你想要什么样的集合。

答案 1 :(得分:6)

首先:按类型实例化模板。因此,如果你有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 :(得分:2)

好吧,你错过了一个模板参数。您无法创建collection对象,这只是一个模板。

你只能创建例如collection<int>collection<std::string>

答案 3 :(得分:1)

您需要指定模板的类型,例如int或其他类型:

collection<int> b; 

答案 4 :(得分:0)

您的代码中存在大量错误。首先在头文件中定义模板:

在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

然后在main函数内的.cpp文件中执行以下操作:

  collection<int> b;

您可以使用不同的类型而不是int,但主要的一点是您需要一个TYPE来实例化模板。