2016-11-11 72 views
0

我想编写一个模板类,使数组具有重载乘法运算符。模板类的实际内部看起来很好,但是我对*运算符的重载有问题。我原来有一个重载操作符用于在常规类中乘数组,在这里我使用第一个重载操作符作为模板的基础。重载模板类数组中的乘法运算符

这是什么在我的头文件:

operator * (const Array<T>& a) const; //* operator 

这是什么在我的主文件:

template <class T> 
Array<T>::operator * (const Array<T>& a) const 
{ 
    if (num != a.num) 
    { 
     cout << "Error, arrays not equal!" << endl; 
    } 

    Array<int> tmp; 
    delete[] tmp.data; 

    tmp.data = new int[cap]; 
    tmp.num = a.num; 
    tmp.cap = a.cap; 

    memcpy(tmp.data, a.data, sizeof(int)*num); 


    for(int i = 0 ; i < num ; i++) 
    { 
     tmp.data[i] = tmp.data[i] * a.data[i]; 
    } 

    return tmp; 
} 

我收到了告诉我,什么是错与TMP的错误。它声明“错误:无法在函数结尾处将'Array'转换为'int'返回”参考“return tmp”。

我想乘两个阵列(a和c)在主()创建

Array <int> d = a * c; 

有与阵列d错误消息,但这些也似乎植根于错误重载内部操作员功能。 tmp如何变成'int'?

回答

0

你需要模板Array<int> tmp;作为Array<T> tmp;,这样你memcpy(tmp.data, a.data, sizeof(int)*num);内存区域的大小将是相同的。另外,正如@Thecocatrice提到的那样,将retutn类型添加到您的重载操作符中。 这将看起来像

template<typename T> 
Array<T> Array<T>::operator *(const Array<T> &a) { ... }; 

最后。你实际上并不需要memcpy。它没有任何意义,因为你仍然有循环。只要写:

for(int i = 0 ; i < num ; i++) 
{ 
    tmp.data[i] = data[i] * a.data[i]; 
} 
0

您的函数没有返回类型。因此C++将默认为int。 要解决这个问题,请确保函数返回Array<int>(tmp的类型)。

+1

我认为它实际上是做渎职的编译器,我认为标准禁止这种行为(C99确实太少,没有理由C++难道不),但不以此为理所当然 – Creris