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