6

ここにこのコードがあります。

#include <iostream>
using namespace std;

template <typename T> inline T bigArry(const T data[5])
{
    T level = data[0];
    for(T item : data) // error C2143: syntax error : missing ',' before ':' (1st)
    { //error C2143: syntax error : missing ';' before '{' (3rd)
        if(level<item){ level=item; }
    }
    return  level;
}

int main()
{
    int data[5]={//five variables}
    cout << bigArry(data);//see reference to function template instantiation 'T bigArry<int>(const T [])' being compiled with [ T=int] (2nd)

    return 0;
}

関数 bigArry() は、5 つの要素の配列から最大値を返します。

問題は、範囲ベースのループを使用すると、コードに記載されているエラーが発生することです。しかし、通常の for を使用すると、すべてが正常に戻ります。つまり、構文は問題ないように見えますが、問題はわかりません。Visual Studio 2010 を使用しています。

他に聞きたいのは、インライン関数についてです。現在、C++ Primer Plus 6th edition を読んでいます。関数が大きすぎてインライン化できないことはいつわかりますか? コードを短くする基準はありますか? それとも、大丈夫だと「思う」ときにインライン関数を使用しますか?

4

2 に答える 2

7

パラメーターdataは、関数テンプレートの配列ではありません。それは実際にはポインターです。

この機能

template <typename T> inline T bigArry(const T data[5])

これとまったく同じです:

template <typename T> inline T bigArry(const T *data)

まったく違いはありません。

これが、コードでコンパイル エラーが発生する理由です。

ここにはいくつかの修正があります:

  • 次のように、参照によって引数を受け入れることができます。

    template <typename T> 
    inline T bigArry(const T (&data)[5]) //NOTE &
    

    それはうまくいくはずです。しかし、それは面倒に見えます。たぶん、次を使用します。

  • または、これを使用することもできます (@yzt の提案による):

    template <typename C> 
    inline auto bigArry(C const & data) -> decltype(data[0])
    

    これはクリーンであるだけでなく、上記のもの (および以下のもの) よりも柔軟です。配列を渡すだけでなく、適切に定義され、本来の意味を持っている限り、任意のコンテナーを渡すことができます。data[0]

  • または、必要に応じて、次のように使用できますstd::array<T, 5>

    template <typename T> 
    inline T bigArry(const std::array<T,5> & data) 
    

それが役立つことを願っています。

于 2013-06-29T16:40:13.163 に答える