2012-11-22 141 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]中的中级和高级图书。即使是初学者的书籍也应该至少给你介绍一下。