先日書いた( 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 というような位置に書くという文法を、昨日までは知らなかった。
あまり使う機会はないと思うけれど。
南無南無。