0

私は、演算子のオーバーロードを含む配列クラスをテンプレート化されたクラスに変換しようとしている初期段階にあります。現時点では、テンプレート定義をクラスと各関数に追加しようとしています。これはかなり単純なはずですが、プログラムを実行するたびにスコープエラーが発生します。

コンパイラは、 `T'がこのスコープで宣言されていないと言います(エラーが発生した行にコメントします)。このエラーは、他の関数定義でも再発します。私はテンプレート化されたクラスをガイドとして呼び出すプログラムを使用しており、それは私が試みているのとまったく同じ方法で関数を実装します(それが私が混乱している理由です)。これを解決するには何をする必要がありますか?

ありがとうございました。

#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <stdexcept>
using namespace std;

#ifndef ARRAY_H
#define ARRAY_H

template <typename T>
class Array
{
  public:
         Array(int = 10);
         Array(const Array&);
         ~Array();
         int getSize() const;

         const Array &operator=(const Array &);
         bool operator==(const Array&) const;

         bool operator!=(const Array &right) const
         {
              return ! (*this == right);     
         }     

         int &operator[](int);
         int operator[](int) const;
  private:
          int size;
          int *ptr;        
};

#endif

template<typename t>
Array<T>::Array(int arraySize) //ERROR: T was not declared in this scope***********
{
 if(arraySize > 0)
              size = arraySize;
 else
     throw invalid_argument("Array size myst be greater than 0");

 ptr = new int[size];

 for(int i = 0; i < size; i++)
              ptr[i] = 0;   
}

template<typename t>
Array<T>::Array(const Array &arrayToCopy): size(arrayToCopy.size)
{
 ptr = new int[size];

 for(int i = 0; i < size; i++)
         ptr[i] = arrayToCopy.ptr[i];                  
}

template<typename t>
Array<T>::~Array()
{
 delete [] ptr;              
}

template<typename t>
int Array<T>::getSize() const
{
 return size;   
}

template<typename t>
const Array<T> &Array::operator=(const Array &right)
{
 if (&right != this)
 {
    if(size != right.size)
    {
            delete [] ptr;
            size = right.size;  
            ptr = new int[size];
    }

 for(int i = 0; i < size; i++)
         ptr[i] = right.ptr[i]; 
 }  

 return *this;
}

template<typename t>
bool Array<T>::operator==(const Array &right) const
{
 if(size != right.size)
         return false;

 for(int i = 0; i < size; i++)
         if(ptr[i] != right.ptr[i])
                   return false;

 return true;     
}

template<typename t>
int &Array<T>::operator[](int subscript)
{
 if(subscript < 0 || subscript >= size)
              throw out_of_range("Subscript out of range");

 return ptr[subscript];   
}

template<typename t>
int Array<T>::operator[](int subscript) const
{   
    if(subscript < 0 || subscript >= size)
                 throw out_of_range("Subscript out of range");

    return ptr[subscript];
}

int main()
{
    //main is empty at the moment because I want to make sure that the class is functional
    //before implementing the driver function.

    system("pause");  
}
4

1 に答える 1

5

各関数定義の前に、次のように記述しました。

template<typename t>

もしかして:

template<typename T>

つまり、大文字であるクラスのテンプレートパラメータと一致する必要がありますT

于 2013-03-26T18:13:39.693 に答える