ポイントの位置と基になる型がテンプレートである固定小数点演算クラスを作成しようとしています
template <int P, typename T>
class basic_fixedpoint{
//stuff
};
また、さまざまな型に特化した単一のテンプレート化された暗黙のコンストラクターを公開したいと考えています
//inside basic_fixedpoint
template <typename U>
basic_fixedpoint(const U& arg);
他の場所では、int、float、double などの特殊化を実装します。ただし、P と T が異なる任意のタイプの basic_fixedpoint の一般的な特殊化も提供したいと考えています。これをテンプレート化されたテンプレートの特殊化としてどのように行うことができますか?
template <int P, typename T> //for the class whose constructor i specialize
template <int OP, typename OT> //for the parameters of the argument
basic_fixedpoint<P, T>::basic_fixedpoint<basic_fixedpoint<OP, OT> >(const basic_fixedpoint<OP, OT>& arg)
: /*init things here*/ {} // this fails
コンストラクターのオーバーロードを避けて、ヘッダーに単一のインターフェイスを提示することを避けようとしています。ユーザーに「このクラスは、指定した型からきれいに構築されます。そうしないと、コンパイルに失敗して、理解できない長い段落が表示されます。エラーメッセージ"
サブ質問として: このクラスは、基本的な演算子 int()、演算子 float()、演算子 double() 変換も実装し、オーバーロードされた算術演算子と数学関数も提供されます。当然のことながら、このクラスで何かを呼び出そうとすると、あらゆる可能性が利用可能であるため、呼び出しがあいまいになります。
このクラスを完全に柔軟に保ちながら、適切に動作する明確でオーバーロードされた関数呼び出しを (常にクラスを double に変換して元に戻すのではなく) 許可するにはどうすればよいでしょうか?