2012-02-01 121 views
0

我有一個模板類「ArrayTemp」,它創建了一個類型爲T的指針數組,並且試圖創建一個將執行數值操作的派生模板。我無法實現一個運算符+,它將添加每個數組的元素並返回一個包含總和的新數組。泛型繼承和重載運算符+

我的模板基類:

#include <iostream> 
using namespace std; 

template <class T> 
class ArrayTemp 
{ 
private: 
    T* arr; 
    int arrSize; 
    static int DSize; 

public: 
    ArrayTemp(): arrSize(DSize), arr(new T[DSize]) {} 
    ArrayTemp(const ArrayTemp<T>& at): arrSize(at.arrSize), arr(new T[at.arrSize]) 
    { 
     for (int i = 0; i < at.arrSize; ++i) 
      arr[i] = at.arr[i]; 
    } 
    ~ArrayTemp() 
    { 
     delete [] arr; 
    } 

    ArrayTemp<T>& operator = (const ArrayTemp<T>& source) 
{ 
    if (this != &source) 
    { 
     for (int i = 0; i < arrSize; ++i) 
      setElement(source.getElement(i), i); 
    } 
      return *this; 
} 

    int getarrSize() { return arrSize; } 
    T& getElement(const int index) { return arr[index]; } 
    void setElement(const T& x, int index) { arr[index] = x; } 
}; 

我的衍生模板:

#pragma once 

#include "ArrayTemp.h" 

template <class T> 
class numbers: public ArrayTemp<T> 
{ 
public: 
    numbers(): ArrayTemp<T>() 
    { 
     for (int i = 0; i < (getarrSize()); ++i) 
      setElement(0, i); 
    } 
    numbers(const numbers<T>& n): ArrayTemp<T>(const ArrayTemp<T>& x) {} 
    ~numbers(){} 

    numbers<T> operator + (const numbers<T>& n) const 
    { 
     numbers<int> arraysum; 

     for (int i = 0; i < getarrSize(); ++i) 
      arraysum.setElement((n.getElement(i) + getElement(i)), i); 

     return arraysum; 
    } 
}; 

template <class T> int ArrayTemp<T>::DSize = 5; 

所以我可以做這樣的事情在main():

numbers<int> n1; 
numbers<int> n2; 
numbers<int> n3; 

n3 = n1 + n2; 

如何是一個重載operator +應該在類似於我上面介紹的結構中實現嗎?我應該嘗試使用返回數字對象的副本構造函數嗎?此外,我認爲,因爲派生模板中沒有新的數據成員,定義一個只調用ArrayTemp賦值運算符的賦值運算符就足夠了?

錯誤我正在嘗試這種方法:

cannot convert 'this' pointer from 'const numbers<T>' to 'ArrayTemp<T> &' 
1>   with 
1>   [ 
1>    T=int 
1>   ] 
1>   Conversion loses qualifiers 
while compiling class template member function 'numbers<T> numbers<T>::operator +(const numbers<T> &) const' 
1>   with 
1>   [ 
1>    T=int 
1>   ] 
+1

您遇到的問題到底是什麼?如果您的加法運算符有錯誤,可能是因爲您聲明返回類型爲而不是數字。 – wrren 2012-02-01 17:34:33

+0

這種類型意味着每個類型T都定義了+運算符。當您添加兩個元素(n.getElement(i)+ getElement(i))時,您將對T類型的兩個元素使用+運算符。非常適合簡單的整數情況,但對於自定義類型可能不是那麼好。 – dolphy 2012-02-01 17:40:56

+0

@Rhuidean這裏是我正在得到的當前錯誤。我最初沒有包括它,因爲我嘗試了很多方法來嘗試和實施操作員,並剛剛屈服於尋求幫助,因此我不知道要提交哪個嘗試和相應的錯誤:S – bqui56 2012-02-01 17:47:37

回答

3

最直接的答案似乎是,你需要聲明你的函數常量,正確版本的基本模板:

int getarrSize() const { return arrSize; } 
T & getElement(int index) { return arr[index]; } 
T const & getElement(int index) const { return arr[index]; } 

一更好的答案可能是您可以通過使用現有的標準容器來安全地完成大量工作。