accum <int>(&amp; name [0],&amp; name [length])给出错误,无法将参数1从'char *'转换为'const int *'</int>

时间:2012-11-27 10:15:57

标签: c++ templates

#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 ++标准的变化使得这非法或者这是我正在阅读的书中的错误。

2 个答案:

答案 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*的隐式转换。如果这就是本书所说的内容,则会出现错误。