2009年3月6日金曜日

C++: コンパイラは何を知りたがっている?

このブログ記事をはてなブックマークに追加

template<class T> void print_vector(const std::vector<T>& v) { for (std::vector<T>::const_iterator p = v.begin(); p != v.end(); ++p) std::cout << *p << std::endl; }

問題: 上に書いたコードを含むソースをコンパイルしたらエラーが出た。コンパイラにとって何かの情報が足りないようだ。どこが間違っているのだろうか?

答えは以下の通りで、「typenameが抜けている」。

template<class T> void print_vector(const std::vector<T>& v) { for (typename std::vector<T>::const_iterator p = v.begin(); p != v.end(); ++p) std::cout << *p << std::endl; }

コンパイラからはテンプレートパラメータTを含むstd::vector<T>::const_iteratorが型かどうか判断できないので、型であることを明示的に教える必要がある。

まあ、コンパイラによってはtypenameがなくても通っちゃったりするんだけどね。

0 コメント: