Aug 25, 2006

ARM C++ Compiler のバグというかだめだめなところ

ポスト @ 0:37:10 | プログラミング,C++,BREW

BREW用C++ライブラリを作っていていつもハマるのが、ARMコンパイラのC++、特にテンプレート絡みでのバグの多さです。。。

今日ハマったのは、こんなケースです。(実際にはもっとテンプレート引数多し)

template<class Key> class EqualTo { ... };
template<class Key> class DefaultHasher { ... };
template<> class DefaultHasher<int> { ... };
template<> class DefaultHasher<const CString&> { ... };

template<class Key, claee Value, class Hasher = DefaultHasher<Key>, class Compare = EqualTo<Key> > class CHashTable { ... };

CHashTable<int, CPairT<int, int> > map; // <- ERROR OCCURRED!

コンパイラのメッセージとしては「テンプレート引数が無効」だとか…

いろいろ調べましたが、どうやら、以下のようなカラクリがあるようでした。

  • テンプレートクラスのテンプレート引数に、前方参照で引数を用いるテンプレートがあって、
  • そのテンプレートに、その引数で一致する特別バージョンがあると、
  • ARMコンパイラはそのテンプレートを解決済みの普通のクラスとみなしてしまい、
  • 大元のテンプレートクラスをインスタンス化する際に「テンプレート引数の型が合わない」とみなしてしまう

あぁなんのこっちゃ。。。

ちなみに、特別バージョンのない EqualTo<Key> ではそういう問題は起こりません。

ARMコンパイラは、少なくとも VC6 よりはテンプレートをまともに解釈できるようですが、そのまともぶりが中途半端なので、時としてこういうよくわからないワナにはまってしまうのでした。。。。涙

Trackback

No Trackbacks

Track from Your Website

http://blog.izumichan.com/trackback/tb.php?id=323

Comment

No Comments

Post Your Comment


*は入力必須です。E-Mailは公開されません。