2012-11-22 139 views
1

我正在嘗試製作一個具有數組作爲參數的模板函數。該函數重新構造數組中的數字的總和。將數組傳遞到模板函數

這是我的代碼:

template <class var> 
var sum_numbers(var array[]) { 
    var sum = 0; 
    for (int f1=0; array[f1]!='\0'; f1++) { 
     sum = sum + array[f1]; 
    } 
    return sum; 
} 

函數總是返回

-2001120059 

能否請您給一些想法如何提高我的代碼,你可以請給我一些參考在哪裏可以找到有關模板的更多信息?

非常感謝。

UPDATE: 我的輸入,以及函數調用:

int a[] = {1,2,3,4,5}; 
cout << sum_numbers(a) << endl; 
+0

代碼似乎沒有任何錯誤,您的數組中可能有垃圾。 –

+0

也許這實際上是元素的總和? – chill

+0

你的樣本輸入是什麼? – PearsonArtPhoto

回答

10

你的代碼似乎想到的是,數組是零終止。沒有這樣的事情是保證。這隻會發生在字符串文字。你的函數實際上並不需要一個數組,它需要一個指針。你不能按值的數組,但如果你想通過參考拿一個,你可以這樣做:或者,更簡潔

template <class var, size_t N> 
var sum_numbers(var (&array)[N]) { 
    var sum = 0; 
    for (size_t f1=0; f1<N; f1++) { 
     sum = sum + array[f1]; 
    } 
    return sum; 
} 

template<typename T, size_t N> 
T sum_numbers(T (&arr)[N]) { 
    return std::accumulate(arr, arr + N, T()); 
} 

或者,如果你想走完全通用的,並且對C++ 11的良好支持:

template<typename C> 
auto sum_numbers(C const & c) 
    -> typename std::remove_reference<decltype(*std::begin(c))>::type 
{ 
    typedef typename std::remove_reference<decltype(*std::begin(c))>::type value_type; 
    return std::accumulate(std::begin(c), std::end(c), value_type()); 
} 

可以請您給我一些參考在哪裏可以找到關於TE更多信息 mplates?

請參閱[this list]中的中級和高級圖書。即使是初學者的書籍也應該至少給你介紹一下。