鍋あり谷あり

テーマを決めずに適当に書いています。

C++は難しい

先日書いた( id:Nabetani:20051021:p1 )、template のあやしげな使い方でコピーコンストラクタを禁止する作戦は、gcc に通用しなかった。
通用しない gcc が悪いのか、通用してしまう microsoftコンパイラが悪いのか、あるいは実装依存なのか。私にはわからない。

それとは別に。
今日知った C++ の文法。C++ を使うようになって十年ぐらいになるが、いまだに知らない文法があるのがすごい。まあ今日知った文法は十年前にはなかったものに違いないのだが。

まずは、以前から知っていた文法:

template< typename T > struct X{
  typedef typename T::foo type; // typename と書かないとエラー
};
struct Foo{  typedef int foo;  };
X<Foo>::type x;

T::foo が型名であることを示すため、typename T::foo と書かなくてはいけない。
コンパイラによっては書かなくても通ったりするが、たぶん、書かないとエラーになるのが正しい。

で。T::foo が、単なる型名ではなく、template名の時には:

template< typename T > struct Y{
  typedef typename T::template bar<Y> type; // typename と template が両方必要。たぶん。
};
struct Bar{  template < typename T > struct bar{};  };
Y<Bar>::type y;

このように書く。らしい。
予約語“template” を、T::template bar というような位置に書くという文法を、昨日までは知らなかった。
あまり使う機会はないと思うけれど。

南無南無。