Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What does "missing template argument" mean?

Tags:

c++

templates

I'm pretty new to C++ and this site so there are bound to be errors. When I try to compile my code I get errors like error: missing template argument before 'b'. I've been searching the world for answers for hours and it has led me here.

My assignment is to implement a templated class Collection that stores a collection of Objects using an array, along with the current size of the 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;
    }
like image 819
Josh Avatar asked Feb 08 '12 14:02

Josh


People also ask

What is a template argument?

A template parameter is a special kind of parameter that can be used to pass a type as argument: just like regular function parameters can be used to pass values to a function, template parameters allow to pass also types to a function.

What is template argument deduction?

Template argument deduction is used when selecting user-defined conversion function template arguments. A is the type that is required as the result of the conversion. P is the return type of the conversion function template.

Which is a correct example of template parameters?

For example, given a specialization Stack<int>, “int” is a template argument. Instantiation: This is when the compiler generates a regular class, method, or function by substituting each of the template's parameters with a concrete type.

What means empty template?

It means that default template arguments are used. For example, if you had a template : template < typename T = int > struct A; then this would have type int for the template argument : A<> a; Follow this answer to receive notifications.


2 Answers

You have to say what it's a collection of.

template <class A> class collection {}

requires that you use it as

collection<int> b;

or some appropriate type. That then makes a collection of ints. You haven't told it what you want a collection of.

like image 80
Tom Tanner Avatar answered Oct 19 '22 14:10

Tom Tanner


First : Instantiate template by type. So if you have template <typename obj> class T {...}; you should use it like

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

You can use a template with default value for the typename parameter defined in the class template declaration

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

void main { 
  T<> t;
} 

but anyway you should put empty angle brackets when use it without parameter.

Second: While declaring template, place it whole in the header file. Each definition of his methods should be in the file "*.h", don't ask me why, just don't split it to the header and "cpp" file.

Hope it helps.

like image 20
Dmitriy Kachko Avatar answered Oct 19 '22 13:10

Dmitriy Kachko