0

私はC++の初心者です。C++ で文字列配列のサイズを確認したい。このフォーラムのアドバイスに従って、配列のサイズを示すテンプレートを作成しました。関連するコードは

virtual std::string _verify_list_or_string(std::string obj[]) {     
    std::cout << "debug " << sizeof_array(std::string, sizeof(obj)) << std::endl;

私が使用しているテンプレートは

template <typename T, std::size_t N>
std::size_t sizeof_array( T (&)[N] ) {
   return N;
}

コンパイル エラーが表示されます:「エラー: ',' の前にプライマリ式が必要です」

私は何を間違っていますか?

4

4 に答える 4

3

問題は、 にもかかわらず、[]関数の引数がポインターであり、配列ではないことです。参照によってのみ配列を関数に渡すことができ、特定のサイズの配列への参照である必要があります。サイズは配列の型の一部です。

ポインターとして渡された配列のサイズが必要な場合は、次のオプションがあります。

  • 関数自体を のようにテンプレートにsizeof_arrayして、配列が参照によって渡され、サイズがテンプレート パラメーターとして使用できるようにします。
  • 関数を 2 つの引数でイテレータ範囲を取るテンプレートにして、あらゆる種類のシーケンス (配列を含む) で使用できるようにします。
  • 配列のサイズを 2 番目の引数として渡します。
  • のようなクラス型を渡すstd::arraystd::vector、サイズを提供できるインターフェイスを使用します。

エラーは、ナンセンスを に渡しているためですsizeof_arrayobj配列の場合は を実行sizeof_array(obj)し、テンプレート引数は の型から推測されobjます。しかし、それは配列ではないので、それもうまくいきません。

于 2013-09-27T15:53:26.293 に答える
2

問題のある式はsizeof_array(std::string, sizeof(obj)):std::stringは式ではなく型です。ただし、その式を修正しても役に立ちません。引数は型を持ち、引数として配列参照を取るためobj、適切な引数ではありません。sizeof_array()std::string*sizeof_array()

配列がポインターに分解されると、配列のサイズを回復する方法はありません。関数内の配列のサイズを自動的に決定したい場合は、参照によって配列を渡す必要があります。次に例を示します。

template <int Size>
std::string _verify_list_or_string(std::string (&obj)[Size]) {
    std::cout << "debug " << sizeof_array(obj) << '\n';
    return _verify_list_or_string(obj, Size);
}
virtual std::string _verify_list_or_string(std::string* obj, int Size) {
    ...
}

プライマリ エントリ ポイントがテンプレートに変更されたことに注意してくださいvirtualvirtualしたがって、配列へのポインターとそのサイズを受け取る関数に転送されます。

于 2013-09-27T15:54:38.833 に答える
2

関数は 1 つのパラメーターを受け取ります。

std::size_t sizeof_array( T (&)[N] )
//                       ^^^^^^^^^^

しかし、あなたは2つを通過しています。さらに、そのうちの1つ-タイプ:

sizeof_array(std::string, sizeof(obj))
//           ^^^^^^^^^^^^ ^^^^^^^^^^^

objおそらく変数を渡したいでしょう。しかし問題は、objここでは配列ではないということです。したがって、この方法ではサイズを取得できませんobj

于 2013-09-27T15:50:47.897 に答える
0

これは、テンプレート関数を呼び出す方法ではありません...引数ではなく、テンプレートパラメーターが関数呼び出しの括弧内に入ります。この関数は、テンプレート パラメーターを推測するように設計されています。推論が不可能な場合は、次のように呼び出します。

std::string ary[6];
sizeof_array<std::string, 6>(ary);

推論が可能であるため、引数を渡すだけで、コンパイラはテンプレート パラメーターを計算します。

sizeof_array(ary);

残念ながら、そのテンプレート関数は配列でしか機能しませんが、ポインターがあります。入手できるサイズ情報はありません。

于 2013-09-27T15:50:38.663 に答える