2017-02-10 108 views
0
#include<cstdlib> 
#include<iostream> 
#include<math.h> 
#include<string> 
using namespace std; 

class getAverage{ 
public: 

template<class add> 
add computeAverage(add input[], int nosOfElem){ 

add sum = add();//calling default constructor to initialise it. 
for(int index=0;index<=nosOfElem;++index){ 
    sum += input[index]; 
} 

return double(sum)/nosOfElem; 
} 

template<class looptype> 
looptype* returnArray(int sizeOfArray){ 

     looptype* inputArray= (int*)malloc(sizeof(int)*sizeOfArray); 

    for(int index=0;index<=sizeOfArray;++index){ 
     inputArray[index]=index;//=rand() % sizeOfArray; 
     } 
return inputArray; 
} 
}; 

int main(){ 

int sizeOfArray=2; 
int inputArray; 
getAverage gA; 
int* x= gA.returnArray(sizeOfArray); 

for(int index=0;index<=2;++index){ 
cout<<x[index]; 
} 
cout<<endl; 
cout<<gA.computeAverage(x,sizeOfArray); 
free(x); 
return 0; 
} 

我想創建一個模板函數,通過它我可以創建不同類型的動態數組(int,long,string ..等等)。我試過這樣做,並意識到「looptype」永遠不會獲得類型值。有人可以建議一種方法來做到這一點。無法推導出模板參數'looptype'

感謝

+1

爲什麼不'自動?還有什麼'malloc'在C++代碼中做什麼?絕對最少使用'new []',但更好的辦法是使用'std :: vector',這是一個容器,它有方法來產生大小,而不必傳遞C風格的指針和大小對。 – tadman

回答

1
template<class looptype> 
looptype* returnArray(int sizeOfArray){ 

    looptype* inputArray= (int*)malloc(sizeof(int)*sizeOfArray); 
    for(int index=0;index<=sizeOfArray;++index){ 
     inputArray[index]=index;//=rand() % sizeOfArray; 
    } 
    return inputArray; 
} 

模板參數只能從函數模板參數中推演出來。這裏函數模板的唯一參數是sizeOfArray這是一個int。編譯器如何知道typename looptype是什麼?由於無法推斷,因此必須明確指定它。

int* x= gA.returnArray<int>(sizeOfArray); 

而不是:

int* x= gA.returnArray(sizeOfArray); 

順便說一句,什麼是有一個模板參數looptype當我知道這隻能是一個int由這行代碼的賣出點:

... 
looptype* inputArray= (int*)malloc(sizeof(int)*sizeOfArray); 
... 

您使用malloc是可怕的。對於幾乎相同的性能,您將簡單的任務變得複雜。首選std::vector<int>或更壞的情況std::unique_ptr<int[]>