1

値がリストにあるかどうかを確認するこの単純な関数があります。

template <class T>
bool IsinList(list<T> l, T x)
{
    for(list<T>::iterator it=list.begin(); it != list.end(); it++)
    {
        if (*it == x)
            return true;
    }
    return false;
}

次のように、同じ .cpp ファイルで関数を使用しました。

if (!IsinList (words, temp))   
    goodwords.push_back(temp);

しかし、私はこのエラーが発生しています:

'std::list' : use of class template requires template argument list

そして、私は問題が何であるかを理解できません。以前の質問をチェックインしましたが、役に立ちませんでした。私が間違っていることを説明してもらえますか?

4

2 に答える 2

6

タイプミス:

list.begin() / list.end()

する必要があります

l.begin() / l.end()

あなたの変数はlではなくと呼ばれlistます。

編集:

Martinho が指摘したように、これでは不十分かもしれません。一部のコンパイラはこれを受け入れますが、反復子はテンプレート引数に依存するため、型名が必要になる場合があります。

typename list<T>::iterator it=list.begin()
于 2012-05-23T11:48:21.350 に答える
2

タイプミス(listvs. l)を作成し、それが。であることを指定しませんでしlist<T>::iteratortypenamelistさらに、 constへの参照によってと検索引数を渡す必要があります。全体として、次のようになります。

template <class T>
bool IsinList(const list<T>& l, const T& x)
{
    typename list<T>::const_iterator first = l.begin(), last = l.end();
    for(; first != last; ++first)
    {
        if (*it == x)
            return true;
    }
    return false;
}

とはいえ、まだこれを使用しないでください。std::find代わりに使用する方がはるかに良い

if (std::find(words.begin(), words.end(), temp)==words.end())
{
  goodwords.push_back(temp);
}
于 2012-05-23T12:03:46.543 に答える