2016-11-11 49 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