C++でジェネリックプログラミングをするときは、templateを使って引数の型に依存しない関数を定義する。この際、templateとして使用できる型が満たすべき条件を"concept"と呼ぶ。C++には、明示的なconcept checkの機能がないため、template関数に予期しない型を使用した場合、コンパイルが吐き出すエラーが意味をなさないものになりがちである。
例えば、以下の例を考える。
int main()
{
vector<std::complex<float> > v;
stable_sort(v.begin(), v.end());
}
上のソースをコンパイルすると、長くて意味不明なエラーが出力される。(参考ページ1.参照)
これには、ちょっとびっくりさせられる。
エラーが発生した理由は、complexが演算子<をサポートしていないからである。しかし、templateとは単なるplaceholderにすぎないので、stable_sort()の引数であるiteratorが満たすべきconcept "LessThanComparable"をチェックすることができない。結果、深いところまで潜っていって矛盾がでたところでよく分からないあまり意味のないエラーが大量に吐き出される。
これを解決するには、コンパイル時にconcept checkを有効にしてあげるといい。
g++ -o hogehoge -D_GLIBCXX_CONCEPT_CHECKS hogehoge.cpp
-Dxxxxxとは、マクロxxxxを定義してプリプロセッサを実行するという意味。concept checkを有効にすると、LessThanComparableに関する内容がエラーに出力される。
参考ページ:
2. gccのオプション
0 件のコメント:
コメントを投稿