0

範囲内のアイテムを見つけようとしているので、「検索」と呼ばれるテンプレート化された関数に対して複数のテストがあります。

template <typename T> T*  find(T *left, T *end, T item);

これは、私が使用している関数プロトタイプであり、最初のテストでは機能しません。

static void TestFind1(void)
{
  cout << "***** Find1 *****" << endl;
  const int i1[] = {-1, 2, 6, -1, 9, 5, 7, -1, -1, 8, -1};

  int size = sizeof(i1) / sizeof(int);
  const int *end = i1 + size;
  CS170::display(i1, end);
  const int item = 9;
  const int *pos = CS170::find(i1, end, item);
  if (pos != end)
    cout << "Item " << item << " is " << *pos << endl;
  else
    cout << "Item " << item << " was not found" << endl;
}

@ const int *pos "エラー: 関数テンプレート "find" のインスタンスが一致しません 引数リストの引数の型は (const int [11], const int *, const int) と一致します"

このテストで動作する 2 つ目のプロトタイプがありますが、完全にテンプレート化されていないため、const int *pos ではなく int *pos を要求する 2 つ目のテストに失敗します。

2 番目のプロトタイプ:

template <typename T> const int* find(T *left, T *end, const int item);

どのような場合でも最初の関数をテンプレート化する方法がよくわかりません。

4

2 に答える 2

0

type の値を引数const int[11]として渡しています。T* left通常の (非テンプレート) 関数では、const int[11]に暗黙的に変換できるため、これで問題ありませんが、 はテンプレートでconst int*あるためfind、暗黙的な変換は考慮されません。オーバーロードの解決中に暗黙的な変換が考慮されますが、テンプレートのインスタンス化はオーバーロードの解決前に発生します。

次のように変換を強制できます。

const int *pos = CS170::find(static_cast<const int*>(i1), end, item);

またはこのように:

const int *pos = CS170::find(i1 + 0, end, item);
于 2014-03-27T01:59:09.453 に答える
0

const int[]テンプレート メソッドの呼び出しにパラメーターとして aと aを渡そうとしていることconst int*、およびテンプレートのインスタンス化では暗黙的な変換が考慮されていないことを考慮すると、テンプレート関数のシグネチャは次のようになります。

template <typename T> 
const T* find(const T *left, const T *end, const T& item);

例えば:

template <typename T> 
const T* find(const T *left, const T *end, const T& item) {
  while (left != end) {
    if (item == *left) {
      return left;
    }
    ++left;
  }
  return end;
}

または、非 constint[]およびint*パラメーターを使用するようにクライアント コードを変更すると、関数テンプレート シグネチャの 1 つが機能するはずです。

しかし、あなたが使用していない理由はありますstd::findか?

于 2014-03-27T00:39:21.273 に答える