質問: u16todbm >(10, 32768.0, 0.0); // コンパイル通る } ``` complexとdoubleの*や+が定義されていないのか?と思いますが、実装方法がわかりません。 お教え願えないでしょうか。
回答: ``` int a = 1.0; ``` とはかけない言語仕様(浮動小数点数を整数へ変換する際に切り捨てや丸めなどいくつかの方法があるため一意に変換することができず暗黙変換が定義されない)なのでcomplexでTが整数型の場合は四則演算可能な型はTへの暗黙変換可能な型に対してしか定義されていない(定義すべきでないから)と思います。complexの定義を見ていないので推測ですが厳密にはTの値を実部と仮定するTからcomplexへの暗黙変換が定義されているように思います。 以上からu16todbmは以下のような使い方が適切だと思います。 ``` u16todbm>(10, 32768, 0); ``` あえて浮動小数点数を指定したいのであれば整数への変換を明示的に実装したu16todbm相当の別のテンプレート関数を定義すべきと思いますが、実装してみると若干不格好なものになりますね。 ``` template samp_type u16todbm_cast(samp_type a, double add, double mul) { a = a * (cast_type)mul; a = a + (cast_type)add; return a; } ``` 手元にC++環境がなく確認できてませんので間違いなどあった場合はご容赦ください