c+中常量数组的平均值模板+; 我在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; }

c+中常量数组的平均值模板+; 我在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; },c++,arrays,templates,C++,Arrays,Templates,错误C3892:“s”:无法将赋值给常量为的变量 如何定义此模板以从常量数组进行计算?实际上,您的函数采用的是指针,而不是数组T T[]与T*T相同 只需将指针指向常量,而不是指向非常量: 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;

错误C3892:“s”:无法将赋值给常量为的变量


如何定义此模板以从常量数组进行计算?

实际上,您的函数采用的是指针,而不是数组<由于历史原因,参数列表中的code>T T[]与
T*T
相同

只需将指针指向常量,而不是指向非常量:

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;
}
模板
T平均值(T常数*T,整数n){
ts=T[n-1];
对于(int i=0;i<(n-1);i++)
s+=t[i];
返回序列号;
}
或者,更好的方法是使用迭代器对,这样您就可以将其用于任何容器,而不仅仅是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));
模板
自动平均(开始、结束){
断言(开始!=结束);
自动s=std::累加(开始、结束、0.0);
返回s/std::距离(开始、结束);
}
常数双数组[]={23.4523.5,55.2543.2,6.4};
双a=平均值(标准::开始(数组),标准::结束(数组));

您可以通过以下方式使用类型特征

#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);
}
#包括
#包括
样板
T平均值(T[],整数n)
{
typename std::remove_const::type s=t[n-1];
对于(int i=0;i<(n-1);i++)
s+=t[i];
返回序列号;
}
int main()
{
常数双数组[5]={23.4523.5,55.2543.2,6.4};
双a=平均值(数组,5);
}

虽然你的功能看起来很奇怪。考虑到在一般情况下,参数
n
可以等于零。在这种情况下,您的函数将无效。

另外,0.0?斯雷?它是
typename std::iterator\u traits::value\u type()
#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);
}