1
#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): error C2664: 'accum' : cannot convert parameter 1 from ' char *' to 'const int *'
我的 C++ 有点生疏了。
我只是好奇,如果这种“行为”以前允许,但“最新”C++ 标准发生了变化,使其非法,或者这是我正在阅读的书中的错误。

4

2 回答 2

1

实例化是int accum<int> (int const* beg, int const* end),您不能将char *参数传递给此函数。

未注释行起作用的原因是它实例化了accum<char>.

于 2012-11-27T10:21:03.537 回答
1

该行accum<int>(&name[0], &name[length])尝试调用使用int accumt(const int*, const int*)类型参数声明的函数char*, char*。编译器的抱怨是对的:C++ 从不允许隐式转换char*int*. 如果书上是这么说的,那就有错误了。

于 2012-11-27T10:21:55.550 回答