1

次のコード行とコンパイル エラーがあります。テンプレート関数、C++ジェネリック、またはその他の何かについての私の間違った理解のはずです。ご指摘ありがとうございます。

#include <iostream>
#include <vector>

using namespace std;

template <typename T>
T* find(vector<T> &vec, T value)
{
  vector<T>::iterator first = vec.begin();
  vector<T>::iterator last = vec.end();
  for(; first != last; first ++)
      if(*first == value)
          return first;
  return 0;
}

コンソールのコンパイル エラー

debug.cpp: In function ‘T* find(std::vector<T, std::allocator<_CharT> >&, T)’:
debug.cpp:9: error: expected `;' before ‘first’
debug.cpp:10: error: expected `;' before ‘last’
debug.cpp:11: error: ‘first’ was not declared in this scope
debug.cpp:11: error: ‘last’ was not declared in this scope
4

3 に答える 3

5

typename vector<T>::iterator first最後に and 同様に使用する必要があります。それ以外の場合、コンパイラはそれが型であることを認識しないため、宣言があいまいであると判断しvector<T>::iteratorます。メンバー関数またはその他のものにすることができます。技術的には、それらは呼び出されdependent typenamesます (テンプレートの型に依存するためTです。依存型があるたびに、typenameこのような頭痛を避けるために使用します。詳細については、http: //pages.cs.wisc.edu/~driscoll/typename.htmlなどを参照してください)。 .

于 2014-04-26T02:19:28.860 に答える
2

typename型名の依存関係のために必要なキーワードを含めないことに加えて、他の誰かのアルゴリズム、つまりstd::find. 型名の依存関係とは何か、解決が必要な理由については、この回答は私よりもはるかにうまく説明しています。

また、コンテナー イテレーター型をアイテム タイプ ポインターとして扱うこともできます。これはベクトルで機能しますが、イテレーターがラッパーであり即時ポインターではない別のコンテナーを使用する場合は、コードが大幅に制限されます。

コードの短縮とtypename問題への対処について:

template <typename T>
T* find(std::vector<T> &vec, const T& value)
{
    typename std::vector<T>::iterator it = std::find(vec.begin(), vec.end(), value);
    return (it != vec.end()) ? &(*it) : nullptr;
}

注: C++11 では、これはauto

template <typename T>
T* find(std::vector<T> &vec, const T& value)
{
    auto it = std::find(vec.begin(), vec.end(), value);
    return (it != vec.end()) ? &(*it) : nullptr;
}
于 2014-04-26T02:28:26.713 に答える
0

以下は動作するバージョンですが、元の投稿のコードが正しくない理由はまだ明らかではありません.

#include <iostream>
#include <vector>

using namespace std;

template <typename IteratorType, typename T>
IteratorType find(IteratorType first, IteratorType last, T &value)
{
  for(; first != last; first ++)
      if (*first == value)
          return first;
  return last;
}
于 2014-04-26T02:10:19.870 に答える