0

C++ で std リストを出力する関数を作成しようとしています。テンプレート関数の場合、T をテンプレート引数として使用できないというのは本当ですか?

template <typename T>
void printlist(list<T> a)
{
    list<T>::iterator i;
    for (i=a.begin(); i!=a.end(); ++i)
        cout<<*i<<" ";
}
4

3 に答える 3

4

コードはほとんど合法です。一部のコンパイラはそれを受け入れる場合があります...ただし、次の方法で書くことは確実に機能します(using namespace std定義したと仮定します):

template <typename T>
void printlist(list<T> a)
{
    typename list<T>::iterator i;
    for (i=a.begin(); i!=a.end(); ++i)
        cout<<*i<<" ";
}

効率のために、リストを const 参照として渡す必要があります。

template <typename T>
void printlist(const list<T>& a)
{
    typename list<T>::const_iterator i;
    for (i=a.begin(); i!=a.end(); ++i)
        cout<<*i<<" ";
}

ただし、既にこれを行う STL アルゴリズムがあります。整数のリストを出力したいと仮定すると、次のように書くだけです:

copy( a.begin(), a.end(), ostream_iterator<int>( cout, " " ) );

int適切な要素タイプに置き換えるだけです。注: このアルゴリズムは、任意のシーケンスで機能します。

于 2013-11-02T22:13:35.887 に答える
3

C++プログラムを解析するために、コンパイラは特定の名前について、名前がタイプタイプかを知る必要があるC++03標準を使用しているようです。

問題の修正として、機能させるtypename前に追加する必要がありますlist<T>::iterator

template <typename T>
void printlist(list<T> a)
{
    typename list<T>::iterator i;
    for (i=a.begin(); i!=a.end(); ++i)
        cout << *i << " ";
}
于 2013-11-02T22:12:13.037 に答える
-2

テンプレート名listが に解決されていstd::listますか?

編集: typename キーワードを忘れました。コンパイラのエラー メッセージには、ほとんどの場合、「依存型には型名が必要です」と表示されます。これは、問題について投稿するときにエラー メッセージを含める必要があることを強調しています。

その他のフィードバック:

  • i のようなイテレータを構築し、後で初期化することはお勧めできません。これはループlist<T>::iterator i = a.begin(); の一部になる可能性があります。for
  • const_iterator を使用できます
  • const 参照ではなく、値でリストを渡しています。つまり、次の宣言の方が適切です。 void printlist(const std::list<T>& a)
于 2013-11-02T22:11:07.260 に答える