2013-03-26 44 views
0

我處於嘗試將包含運算符重載的數組類轉換爲模板化類的初期階段。目前我正在嘗試將模板定義添加到類和每個函數中。這應該是相當簡單的,但是,每當我運行程序,我得到一個範圍錯誤。C++:將Array類轉換爲Class模板(作用域問題)

編譯器說'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"); 
} 
+0

永遠不要在標題中使用「名稱空間...」。這被認爲是非常糟糕的形式。 – 2013-03-26 22:59:29

+0

這不是一個真正的標題。我現在只使用一個.cpp文件,直到我將它分開。 – 2013-03-27 12:35:56

回答

5

您的每一個函數定義之前,你已經寫了:

template<typename t> 

你的意思是:

template<typename T> 

也就是說,它應該符合你的類,這是模板參數首都T

+0

此外,大多數整數應該被替換爲T. – drescherjm 2013-03-26 18:15:01

+0

@drescherjm我認爲他還沒有得到那個部分。 – 2013-03-26 18:16:38

+0

哇。謝謝,有時你只需要別人來看看你的代碼,對吧? @drescherjm:這是我的下一步,將所有模板參數都切換爲需要的模板參數。 – 2013-03-26 18:25:03