私はウェブサイトで宣言を読みました
template <int x>
int func() {
return x;
}
は有効ですが、次は無効です
template <double x>
double func() {
return x;
}
1 つ目はテンプレート関数の正当な宣言であるのに、2 つ目はそうではないのはなぜですか?
私はウェブサイトで宣言を読みました
template <int x>
int func() {
return x;
}
は有効ですが、次は無効です
template <double x>
double func() {
return x;
}
1 つ目はテンプレート関数の正当な宣言であるのに、2 つ目はそうではないのはなぜですか?
整数型ではないため無効です。非型テンプレート パラメーターには特定の制限があり、これはその 1 つです。
浮動小数点数とクラス型オブジェクトは、非型テンプレート パラメーターとして使用できません。
template <double VAT> // ERROR: floating-point values are not
double process(double v) { // allowed as template parameters
return v * VAT;
}
template <std::string name> // ERROR: class-type objects are not
class MyClass { // allowed as template parameters
/* ... */
};
上記はC++ Templatesからの引用です。私はそれを信用しません。
私の理解によると、テンプレートの初期化に有効ではない理由は、float や double などの型が C++ で定義された実装を持っていないためです。したがって、次のようなテンプレートの場合
template <double VAT> double process(double v);
次のように、2 つの異なる double 値で初期化されます。
template <(double) 2/3> double process(2.3)
template <(double) 1/3> double process(2.4);
コンパイラを混乱させる二重の非型のために、それらは同じビット表現を持たない可能性があります。