11

C++ テンプレートの概念を学習しています。以下がわかりません。

#include <iostream>
#include <typeinfo>

using namespace std;

template <typename T>
T fun(T& x)
{
 cout <<" X is "<<x;
 cout <<"Type id is "<<typeid(x).name()<<endl;
}


int main ( int argc, char ** argv)
{
   int a[100];
   fun (a);
}

私は何をしようとしていますか?

1)Tファン(T&X)

ここで x は参照であるため、「a」はポインター型に減衰しませんが、コンパイル中に次のエラーが発生します。

 error: no matching function for call to ‘fun(int [100])’

非参照を試してみると、うまくいきます。私が理解しているように、配列はポインター型に崩壊しています。

4

2 に答える 2

30

C スタイルの配列は非常に基本的な構造であり、組み込み型やユーザー定義型のように割り当て、コピー、または参照はできません。配列を参照渡しするのと同じことを行うには、次の構文が必要です。

// non-const version
template <typename T, size_t N>
void fun( T (&x)[N] ) { ... }

// const version
template <typename T, size_t N>
void fun( const T (&x)[N] ) { ... }

ここで、配列のサイズは、関数が機能できるようにするためのテンプレート パラメーターでもあることに注意T[M]T[N]MくださいN。関数が void を返すことにも注意してください。既に述べたように、配列はコピーできないため、配列を値で返す方法はありません。

于 2013-05-12T08:08:12.877 に答える
6

問題は戻り値の型にあります。配列はコピーできないため、配列を返すことはできません。ちなみに、あなたは何も返していません!

代わりに試してください:

template <typename T>
void fun(T& x)  // <--- note the void
{
    cout <<" X is "<<x;
    cout <<"Type id is "<<typeid(x).name()<<endl;
}

そして、それは期待どおりに機能します。

注: 元の完全なエラー メッセージ (gcc 4.8 を使用) は、実際には次のとおりです。

test.cpp: In function ‘int main(int, char**)’:
test.cpp:17:10: error: no matching function for call to ‘fun(int [100])’
    fun (a);
      ^
test.cpp:17:10: note: candidate is:
test.cpp:7:3: note: template<class T> T fun(T&)
 T fun(T& x)
   ^
test.cpp:7:3: note:   template argument deduction/substitution failed:
test.cpp: In substitution of ‘template<class T> T fun(T&) [with T = int [100]]’:
test.cpp:17:10:   required from here
test.cpp:7:3: error: function returning an array

最も関連性の高い行は最後の行です。

于 2013-05-12T08:29:44.367 に答える