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<<" ";
}
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<<" ";
}
コードはほとんど合法です。一部のコンパイラはそれを受け入れる場合があります...ただし、次の方法で書くことは確実に機能します(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
適切な要素タイプに置き換えるだけです。注: このアルゴリズムは、任意のシーケンスで機能します。
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 << " ";
}
テンプレート名list
が に解決されていstd::list
ますか?
編集: typename キーワードを忘れました。コンパイラのエラー メッセージには、ほとんどの場合、「依存型には型名が必要です」と表示されます。これは、問題について投稿するときにエラー メッセージを含める必要があることを強調しています。
その他のフィードバック:
list<T>::iterator i = a.begin();
の一部になる可能性があります。for
void printlist(const std::list<T>& a)