我在c ++中有以下模板用于计算平均值:
template <typename T>
T average(T t[], int n)
{
T s = t[n - 1];
for (int i = 0; i < (n-1); i++)
s += t[i];
return s / n;
}
但是当我尝试使用常量数组调用函数时,我有一个错误,例如:
const double array[5] = { 23.4, 523.5, 55.2, 543.2, 6.4 };
double a = average(array,5);
错误C3892:'s':您无法分配给const
的变量
如何定义此模板以从常量数组计算?
答案 0 :(得分:7)
实际上,你的函数需要一个指针,而不是一个数组。由于历史原因,参数列表中的T t[]
与T* t
相同。
只需将指针指向const而不是指向非const指针:
template <typename T>
T average(T const* t, int n) {
T s = t[n - 1];
for (int i = 0; i < (n-1); i++)
s += t[i];
return s / n;
}
或者,更好的是,使用迭代器对,这样就可以将它与任何容器一起使用,而不仅仅是C风格的数组:
template <typename It>
auto average(It begin, It end) {
assert(begin != end);
auto s = std::accumulate(begin, end, 0.0);
return s / std::distance(begin, end);
}
const double array[] = { 23.4, 523.5, 55.2, 543.2, 6.4 };
double a = average(std::begin(array), std::end(array));
答案 1 :(得分:1)
您可以按以下方式使用类型特征
#include <iostream>
#include <type_traits>
template <typename T>
T average(T t[], int n)
{
typename std::remove_const<T>::type s = t[n - 1];
for (int i = 0; i < (n-1); i++)
s += t[i];
return s / n;
}
int main()
{
const double array[5] = { 23.4, 523.5, 55.2, 543.2, 6.4 };
double a = average(array,5);
}
虽然你的功能看起来很奇怪。考虑到一般情况下参数n
可以等于零。在这种情况下,您的功能将无效。