2

パラメータとして配列を持つテンプレート関数を作成しようとしています。この関数は、配列内の数値の合計を返します。

これは私のコードです:

template <class var>
var sum_numbers(var array[]) {
    var sum = 0;
    for (int f1=0; array[f1]!='\0'; f1++) {
        sum = sum + array[f1];
    }
    return sum;
}

関数は常に戻ります

-2001120059

私のコードを改善する方法を教えてください。また、テンプレートに関する詳細情報の参照先を教えてください。

どうもありがとうございました。

更新:私の入力と関数呼び出し:

int a[] = {1,2,3,4,5};
cout << sum_numbers(a) << endl;
4

1 に答える 1

11

あなたのコードは、配列がゼロで終了していることを期待しているようです。そのようなことは保証されません。これは、文字列リテラルでのみ発生します。あなたの関数は実際には配列を取らず、ポインタを取ります。配列を値で取得することはできませんが、参照で取得する場合は、次のようにすることができます。

template <class var, size_t N>
var sum_numbers(var (&array)[N]) {
    var sum = 0;
    for (size_t f1=0; f1<N; f1++) {
        sum = sum + array[f1];
    }
    return sum;
}

または、より簡潔に:

template<typename T, size_t N>
T sum_numbers(T (&arr)[N]) {
    return std::accumulate(arr, arr + N, T());
}

または、完全に一般化して、C++11 を適切にサポートしたい場合は、次のようにします。

template<typename C>
auto sum_numbers(C const & c)
    -> typename std::remove_reference<decltype(*std::begin(c))>::type
{
    typedef typename std::remove_reference<decltype(*std::begin(c))>::type value_type;
    return std::accumulate(std::begin(c), std::end(c), value_type());
}

テンプレートの詳細については、どこで参照できますか?

[このリスト]の中級および上級の書籍を参照してください。初心者向けの本でさえ、少なくともそれらの紹介を提供する必要があります.

于 2012-11-22T14:26:12.343 に答える