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)を取得しました:エラー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

この行は、 type の引数でaccum<int>(&name[0], &name[length])宣言された関数を呼び出そうとしています。コンパイラが不平を言うのは正しい: C++ は からへの暗黙的な変換を決して許可しなかった. 本にそう書いてあるなら、間違いです。int accumt(const int*, const int*)char*, char*char*int*

于 2012-11-27T10:21:55.550 に答える