Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ abstract class template

I have the following code:

template <typename T>
class ListBase
{
protected:
    int _size;
public:
    ListBase() {_size=0;}
    virtual ~ListBase() {}
    bool isEmpty() {return (_size ==0);}
    int getSize() {return _size;}

    virtual bool insert(int index, const T &item) = 0;
    virtual bool remove(int index) = 0;
    virtual bool retrieve(int index, T &item) = 0;
    virtual string toString() = 0;
};

My second file defines a subclass:

#define MAXSIZE 50
template <class T>
class ListArray : public ListBase
{//for now to keep things simple use int type only later upgrade to template
private:
    T arraydata[MAXSIZE];
public:

    bool insert(int index,const T &item)
    {
        if(index >= MAXSIZE)
            return false;//max size reach
        if (index<0 || index > getSize() )//index greater than array size?
        {
            cout<<"Invalid index location to insert"<<endl;
            return false;//invalid location
        }

        for(int i = getSize()-1 ; i >= index;i--)
        {//shift to the right
            arraydata[i+1]=arraydata[i];
        }
        arraydata[index] = item;
        _size++;
        return true;
    }

    string ListArray::toString()
    {
        ostringstream ostr;
        ostr<<"[";
        for(int i = 0; i < _size;i++)
            ostr<<arraydata[i]<<' ';
        ostr<<"]"<<endl;
        return ostr.str();
    }
};

My main.cpp:

int main()
{
    ListArray<char> myarray;
    myarray.insert(0,'g');
    myarray.insert(0,'e');
    myarray.insert(1,'q');
    cout<<myarray.toString();
}

I can't seem to figure out how to use a template with a subclass. When I compile my code, I get the following error:

error C2955: 'ListBase' : use of class template requires template argument list see reference to class template instantiation 'ListArray' being compiled

like image 377
user1203499 Avatar asked Feb 19 '12 10:02

user1203499


2 Answers

You didn't specify the template parameter for ListBase.

template <class T>
    class ListArray : public ListBase<T>
                                     ---
like image 194
Karoly Horvath Avatar answered Nov 07 '22 03:11

Karoly Horvath


class ListArray : public ListBase

should be

class ListArray : public ListBase<T>

And you've got a bunch of problems with accessing the base class members. See: Accessing inherited variable from templated parent class.

like image 32
Mat Avatar answered Nov 07 '22 03:11

Mat