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> ]
您遇到的问题到底是什么?如果您的加法运算符有错误,可能是因为您声明返回类型为而不是数字。 –
wrren
2012-02-01 17:34:33
这种类型意味着每个类型T都定义了+运算符。当您添加两个元素(n.getElement(i)+ getElement(i))时,您将对T类型的两个元素使用+运算符。非常适合简单的整数情况,但对于自定义类型可能不是那么好。 – dolphy 2012-02-01 17:40:56
@Rhuidean这里是我正在得到的当前错误。我最初没有包括它,因为我尝试了很多方法来尝试和实施操作员,并刚刚屈服于寻求帮助,因此我不知道要提交哪个尝试和相应的错误:S – bqui56 2012-02-01 17:47:37