#include <iostream>
template <typename T>
inline
T accum (T const* beg, T const* end)
{
T total = T(); // assume T() actually creates a zero value
while (beg != end) {
total += *beg;
++beg;
}
return total;
}
int main()
{
// create array of 5 integer values
int num[]={1,2,3,4,5};
// print average value
std::cout << "the average value of the integer values is "
<< accum(&num[0], &num[5]) / 5
<< '\n';
// create array of character values
char name[] = "templates";
int length = sizeof(name)-1;
// (try to) print average character value
std::cout << "the average value of the characters in \""
<< name << "\" is "
<< accum(&name[0], &name[length]) / length
//<< accum<int>(&name[0], &name[length]) / length //but this give me error
<< '\n';
}
我正在阅读c ++模板:完整的指南书和作者提到的
我可以使用模板专业化
accum<int>(&name[0], &name[length]) / length
我在visual studio 2012中尝试这个并且出错了
main.cpp(34):错误C2664:'accum':无法将参数1从'char *'转换为'const int *'
我的C ++有点生疏
我只是好奇,如果这个“行为”以前被允许但是“最新的”C ++标准的变化使得这非法或者这是我正在阅读的书中的错误。
答案 0 :(得分:1)
实例化为int accum<int> (int const* beg, int const* end)
,您无法将char *
个参数传递给此函数。
取消注释行的作用是它实例化accum<char>
。
答案 1 :(得分:1)
行accum<int>(&name[0], &name[length])
尝试使用int accumt(const int*, const int*)
类型的参数调用声明为char*, char*
的函数。编译器抱怨是对的:C ++从不允许从char*
到int*
的隐式转换。如果这就是本书所说的内容,则会出现错误。