差分表示


*&date(Y-n-j[lL],2010/3/15); watcom,dmcのテンプレート不具合

open watcom 1.9rc1 が出ている模様.
が c++ 関係はあまり進展していないのか、
1.8よりちょっとは増えたようだけれどまだ未実装のSTL関係は多そうで
(stable_sortなかったり)、
クラステンプレートのメンバー関数テンプレートをクラス外に書くのも
まだ未サポートのよう.

 template<typename T>
 class Bar {
 public:
     template<typename U> void test(T* t, U bgn, U end);
 };
 
 template<typename T>
 template<typename U>    // この行.
 void Bar<T>::test(T* dst, U start, U last) {
     while (start != last) *dst++ = *start++;
 }

のBar<T>::testの2つ目のtemplateでシンタックスエラー.

 template<typename T >
 class Foo {
 public:
     template<typename U> void test(T* t, U bgn, U end) {
         while (bgn != end) *t++ = *bgn++;
     }
 };

のようにクラス内に書くのはok.

ついでに、上記は dmd(8.51) でもコンパイルエラー(startが未定義)になる。
こっちは、
テンプレートな引数の名前が
Bar::test()宣言と定義で違うのが気に入らないらしい。
定義側の引数 start, last を bgn, end に修正すれば ok。
(テンプレートでない引数は名前が宣言と定義で違っても無問題)

別のコンパイラ(bcc 5.? だったか)でも、
 template<typename CharT, class Traits>
 class Foo {

のようにクラス定義してメンバー関数を外に
 template<typename C, class T>
 void Foo<C,T>::hoge(…) {

みたいにテンプレート引数名を変えていたら
某かの不具合がでた覚えがあり(名前を統一したらok)

汎用性を思うならば(古いコンパイラ気にするなら)、
クラステンプレートのメンバー(関数)は、
下手にクラス定義から分離せずに、内部に書いてしまうほうが
余計なバグに出会わずに済むのかも。
(分離する場合は名前を揃える...
てか、ひょっとして普通揃えないとダメなのかな?)

(ごちゃごちゃする定義はクラス外部に追い出して、
クラス宣言は身軽にしておこう、
なんて考えてたらドツボにハマることもあった、と)


~

//※dmcもowもc++関係の進展がよろしくないこともあってvc,g++以外のc++として clang に期待、っといったところ.(clangもまだこれからといった雰囲気だけど)


----
#comment