2

DynamicArray.cpp クラスで次のエラーが発生します:「エラー C2143: 構文エラー: ';' がありません」before 'template'" DynamicArray.cpp の 3 行目。それはまだ進行中の作業ですが、デザインに対する批判も本当に感謝しています. ありがとう DynamicArray.h

    #ifndef DYNAMICARRAY_H
    #define DYNAMICARRAY_H
    using namespace std;

    template <class T>
    class DynamicArray
    {
     private:
       T *origin;
       T *allocator;
       int size;
       int current;


     public:
        DynamicArray();
        DynamicArray(int);
        DynamicArray(const DynamicArray&);
        ~DynamicArray();
        void add(int);
        void erase(int);
        void empty();
        T at(int);
        void put(T);
        void remove();
        DynamicArray operator=(const DynamicArray&);
        int getSize();
        void operator[](int);
        T operator=(const T&);
        void insert(T&);
    }


    #endif // !DYNAMICARRAY_H

DynamicArray.cpp

    #include "DynamicArray.h"

    template <class T>
    DynamicArray<T>::DynamicArray()
    {
       origin = new T[5];
       allocator = NULL;
       size = 5;
       current = 0;
       for(int counter = 0; counter <= size - 1; counter++)
       {
         *origin[counter] = NULL;
       }
    }

     template <class T>
     DynamicArray<T>::DynamicArray(int size)
     {
     this->size = size;
     origin = new T[size];

     for(int counter = 0; counter <= size - 1; counter++)
     {
      *origin[counter] = NULL;
     }
     }

     template <class T>
     DynamicArray<T>::DynamicArray(const DynamicArray& obj)
     {
       empty();
       for(int counter = 0; counter < obj.size - 1; counter++)
       {
      origin[counter] = obj.origin[counter];
       }
     }

     template <class T>
     DynamicArray<T>::~DynamicArray()
     {
      delete [] origin;
      delete [] allocator;
      size = NULL;
     }

     template <class T>
     void DynamicArray<T>::add(int size)
     {
      allocator = new T[size]
      for(int counter = 0; counter < this-> size - 1; counter++)
      {
      allocator[counter] = *origin[counter];
      }
      origin = NULL;
      origin = new T[size];
      this->size = size;

      for(int counter = 0; counter < size - 1; counter++)
      {
      *origin[counter] = allocator[counter];
      }
      allocator = NULL;
    }

      template <class T>
      void DynamicArray<T>::erase(int ammount)
      {
      if(ammount - size > size)
      throw "\nnegetive memory location error\n";

      allocator = new T[size - ammount];

      for(int counter = 0; counter < this-> size - ammount - 1; counter++)
      {
      *allocator[counter] = origin[counter];
      }

      origin = NULL;
      size = size - ammount;
      origin = new T[size];

      for(int counter = 0; counter < size - 1; counter++)
      {
      origin[counter] = allocator[counter];
      }
      allocator = NULL;
    }

    template <class T>
    void DynamicArray<T>::empty()
    {
      origin = NULL;
      allocator = NULL;
    }

    template <class T>
    T DynamicArray<T>::at(int location)
    {
      if(location > size || location < 0)
      {
      throw "\nMemory Location does not exist\n";
      }
      else
      {
      current = location;
      return *origin[location];
      }
      }

    /*template <class T>
    void DynamicArray::put(T item)
    {
      add(1);
      origin[size - 1] = item;
    }*/

    template <class T>
    void DynamicArray<T>::remove()
    {
      erase(1);
    }

    template <class T>
    DynamicArray<T> DynamicArray<T>::operator=(const DynamicArray& obj)
    {
      empty();
      for(int counter = 0; counter < obj.size - 1; counter++)
      {
      origin[counter] = obj.origin[counter];
      }

      return *this;
    }

    template <class T>
    int DynamicArray<T>::getSize()
    {
      return size;
    }

    template <class T>
    void DynamicArray<T>::operator[](int index)
    {
      at(index);
    }

    template <class T>
    T DynamicArray<T>::operator=(const T &value)
    {
      put(value);
      return *this;
    }

    template <class T>
    void DynamicArray<T>::insert(T &value)
    {
      int counter = 0;
      do
      {
      if(*origin[counter] == NULL)
      {
          origin[counter] = value;
      }
      counter++
      }
      while(*origin[counter] != NULL)
    }        
4

2 に答える 2

1

2 つの問題があります。;まず、クラス宣言の最後にa が必要です。これが修正されると、テンプレート メソッドの定義がヘッダー ファイル、またはテンプレートのインスタンス化を試みるコードからアクセス可能なファイルにも含まれている必要があるため、問題が発生します。

于 2012-10-05T06:00:11.987 に答える
1

;クラスの最後にが必要です。

    T operator=(const T&);
    void insert(T&);
};


#endif // !DYNAMICARRAY_H

また、ヘッダー ファイルにテンプレート化された関数の定義が必要です。テンプレートが機能する方法は、関数を呼び出したり、関連するデータにアクセスしたりするすべてのコードで利用できる必要があります。コンパイラは、使用されるテンプレートの種類ごとに関数の新しいインスタンスを作成します。このインスタンス化は、テンプレート化されたデータ/関数を使用するコードで行われます。

于 2012-10-05T05:57:55.663 に答える