meryngii.neta

今日も新たな"ネタ"を求めて。

テンプレート名と継承元

C++ではテンプレート名が型名になるという仕様があるのだが、
クラステンプレート名は型名 - meryngii.neta
これはなぜか継承元の指定では使えないらしい。

template <class T>
struct A { };

template <class T>
struct B
	//: A<B> // 1, NG
	: A< B<T> > // 2, OK
{
	typedef A< B<T> >	base1; // 3, OK
	typedef A<B>	base2; // 4, OK
};

VC8では1の部分のコードは通らないが、VC7までは使えたようだ。
http://www.ailight.jp/blog/sha256/archive/2005/08/04/9214.aspx
GCCはVC8と同じ挙動を示すので、言語仕様としてはこれが正しいのだろう。ただし理由は分からない。
この手の記法は自己言及的なテンプレートを使うときによく出てくる。
http://d.hatena.ne.jp/Cryolite/20040605