非型テンプレートの制限

C++のテンプレートは協力で、型以外にもテンプレートに出来ます。

template< class T, int SIZE >
class Array{
	T m_aData[SIZE];
};

だからこそ再帰テンプレートみたいな技が出来るんですよね。

//n次べき関数
template< unsigned int DIMENSION >
struct D_N{
    static double d_n( double arg ){ return arg * D_N< DIMENSION - 1 >::d_n( arg ); }
};
template<>
struct D_N< 0 >{
	static double d_n( double ){ return 1; }
};

テンプレートきちがいな私はアホみたいに使いまくっているんですが、あるときコンパイルが通らないという苦情が来た。

template< class I, I out >
class NN{
	//中略
};

上記のようなクラスを以前作っていたのを以下のように使われた。

NN< float, 0.5f > nn;

コンパイラはVisualStudio2005で、以下のようなエラーが返ってきた。

error C2993: 'float' : 非型テンプレート パラメータ 'out' に対する無効な型です。

最初なんのことか全然わからなかった。クラスの中身はテンプレート展開しても問題ない内容だった。というわけでいろいろ調べてみたらわかった気がしました。原因からいうと、非型テンプレートはどうやら浮動小数点はC++仕様外らしい。理由はよくわからんがどうもそうらしい。もちろん構造体やクラスは論外。そうなると残るのはlong, int, short, char, boolの5つだけ?(__int64もできたけど)要するに整数onlyってわけか。うむ、思ったより不便だな(ぇ


というわけで該当するクラスの修正方法を考えているところだった。まあ浮動小数点はサポート対象外という手もあるけど!(ぉ