0

抽象クラスlinearListを拡張して、具象クラスarrayListを定義しようとしています。

クラスを定義するための私のヘッダーは次のとおりです。classarrayList:public linearList 4行目でエラーが発生しました:エラーC2143:構文エラー:'<'の前に'、'がありません

これは、 linearListを拡張してチェーンを定義するときにも発生します。

名前空間stdを使用し、必要なすべてのファイルを含めるようにしました。linearListクラスにはエラーがないので、 arrayListのエラーだと思います。

また、27行目(コードでマークされている)で「コンパイル中のクラステンプレートインスタンス化'arrayList'への参照を参照してください」というエラーが発生します。arrayListlinearListの両方が以下に含まれています。

配列リスト

#include <iostream>
using namespace std;
template<class T>
class arrayList : public linearList<T> 
{
public:
    // constructor, copy constructor and destructor
    arrayList(int initialCapacity = 10);
    arrayList(const arrayList<T>&);
    ~arrayList() {delete [] element;}
    // ADT methods
    bool empty() const {return listSize == 0;}
    int size() const {return listSize;}
    T& get(int theIndex) const;
    int indexOf(const T& theElement) const;
    void erase(int theIndex);
    void insert(int theIndex, const T& theElement);
    void output(ostream& out) const;
    // additional method
    int capacity() const {return arrayLength;}
protected:
    void checkIndex(int theIndex) const;
    // throw illegalIndex if theIndex invalid
    T* element;      // 1D array to hold list elements
    int arrayLength;       // capacity of the 1D array
    int listSize;          // number of elements in list
}; //line 28
template<class T> 
arrayList<T>::arrayList(int initialCapacity)
{
    // Constructor.
    if (initialCapacity < 1)
    {
        ostringstream s;
        s << "Initial capacity = " << initialCapacity << " Must be > 0";
        throw illegalParameterValue(s.str());
    }
    arrayLength = initialCapacity;
    element = new T[arrayLength];
    listSize = 0;
}
template<class T>
arrayList<T>::arrayList(const arrayList<T>& theList)
{
    // Copy constructor.
    arrayLength = theList.arrayLength;
    listSize = theList.listSize;
    element = new T[arrayLength];
    copy(theList.element, theList.element + listSize, element); 
}
template<class T>
void arrayList<T>::checkIndex(int theIndex) const
{
    // Verify that theIndex is between 0 and 
    // listSize - 1.
    if (theIndex < 0 || theIndex >= listSize)
    {
        ostringstream s;
        s << "index = " << theIndex << " size = " 
            << listSize;
        throw illegalIndex(s.str());
    } 
}
template<class T>
T& arrayList<T>::get(int theIndex) const
{
    // Return element whose index is theIndex.
    // Throw illegalIndex exception if no such
    // element.
    checkIndex(theIndex);
    return element[theIndex];
}
template<class T>
int arrayList<T>::indexOf(const T& theElement)const
{
    // Return index of first occurrence of theElement.
        // search for theElement
        int theIndex = (int) (find(element, element
        + listSize, theElement) - element);
    // check if theElement was found
    if (theIndex == listSize)
        return -1; // not found
    else return theIndex; 
}
template<class T>
void arrayList<T>::erase(int theIndex)
    {// Delete the element whose index is theIndex.
    checkIndex(theIndex);
    // valid index, shift elements with higher
    // index
    copy(element + theIndex + 1, element + 
    listSize,element + theIndex);
    element[--listSize].~T(); // invoke destructor
}
template<class T>
void arrayList<T>::insert(int theIndex, const T& theElement)
{
    // Insert theElement.
    if (theIndex < 0 || theIndex > listSize)

    {// invalid index
        // code to throw an exception comes here
    }
    // valid index, make sure we have space
    if (listSize == arrayLength)
    {
        // no space, double capacity
        changeLength1D(element, arrayLength, 
        2 * arrayLength);
        arrayLength *= 2;
    }
    // shift elements right one position
    copy_backward(element + theIndex, 
    element + listSize,
    element + listSize + 1);
    element[theIndex] = theElement;
    listSize++;
}
template<class T>
void arrayList<T>::output(ostream& out) const
{
    // Put the list into the stream out.
    copy(element, element + listSize, 
        ostream_iterator<T>(out, "  ")); 
}
template <class T>
ostream& operator<<(ostream& out, const arrayList<T>& x)
{x.output(out); return out;}

LinearList

#include <ostream>

using namespace std;

template<class T>
class linearList 
{
public:
virtual ~linearList() {}
virtual bool empty() const = 0;
virtual int size() const = 0;
virtual T& get(int theIndex) const = 0;
virtual int indexOf(const T& theElement)const = 0;
virtual void erase(int theIndex) = 0;
virtual void insert(int theIndex,const T& theElement) = 0;
virtual void output(ostream & out) const = 0;
};
4

1 に答える 1

2

ロリは正しい答えを持っていますが、それが明確でない場合に備えて:

arrayListから継承するため、の定義も知らずlinearListに定義することはできません。これが、コンパイラが4行目で文句を言っている理由です。まだ知りません。はこの問題とは無関係です。ちなみに、ヘッダーファイルにステートメントを含めることはお勧めできません。arrayListlinearListlinearListusing namespace stdusing

「ArrayList」コードサンプルがにarray_list.hあり、「LinearList」がにあると仮定するとlinear_list.h、の最初の数行を次のように変更する必要がありますarray_list.h

#include <iostream>
#include "linear_list.h"

template<class T>
class arrayList : public linearList<T> 
{
public:
...
于 2013-02-15T07:01:18.243 に答える