2012-02-01 12 views
0

T型へのポインタの配列を作成し、数値演算を実行する派生テンプレートを作成しようとしているテンプレートクラス "ArrayTemp"があります。私は、各配列の要素を追加し、合計で新しい配列を返す+演算子を実装するのに問題があります。汎用継承とオーバーロードされた演算子+

マイテンプレートベースクラス:

#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; 

だから私は(メインでこのような何かを行うことができます):

オーバーロードされている方法
numbers<int> n1; 
numbers<int> n2; 
numbers<int> n3; 

n3 = n1 + n2; 

演算子+は、私が上に示したものと同様の構造内で実装されるはずですか?私は数値オブジェクトを返すコピーコンストラクタで何かを試すべきですか?また、派生テンプレートには新しいデータメンバーがないため、ArrayTemp代入演算子を呼び出す代入演算子で十分です。

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

A:すぐに答えはあなたがベーステンプレートであなたの関数のconstの-正しいバージョンを宣言する必要があるように思わ

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

+0

この種のことは、すべての型Tに対して+演算子が定義されていることを意味します.2つの要素(n.getElement(i)+ getElement(i))を追加すると、T型の2つの要素に対して+演算子が使用されます。 intのシンプルなケースには最適ですが、カスタムタイプにはあまり適していない可能性があります。 – dolphy

+0

@Rhuideanここに私が得ている現在のエラーです。私はオペレータを試して実装する方法をたくさん試してみたところ、最初にインクルードしなかったので、助けを求めるだけで何の試行とそれに対応するエラーが出るのかわからなかった:S – bqui56

答えて

3

:私はこの方法を試して取得しています

エラーより良い答えは、既存の標準コンテナを使用することによって、おそらく安全な仕事のトンである可能性があります。

関連する問題