乗算演算の結果の型が入力型の関数になる固定小数点型の複素数クラスを実装しようとしています。複素数を複素数で掛けたり、複素数を実数で掛けたりできる関数が必要です。
これは本質的にコードの簡略化されたバージョンです。A は私の複合型です。
template<typename T1, typename T2> struct rt {};
template<> struct rt<double, double> {
typedef double type;
};
//forward declaration
template<typename T> struct A;
template<typename T1, typename T2>
struct a_rt {
typedef A<typename rt<T1,T2>::type> type;
};
template <typename T>
struct A {
template<typename T2>
typename a_rt<T,T2>::type operator*(const T2& val) const {
typename a_rt<T,T2>::type ret;
cout << "T2& called" << endl;
return ret;
}
template<typename T2>
typename a_rt<T,T2>::type operator*(const A<T2>& val) const {
typename a_rt<T,T2>::type ret;
cout << "A<T2>& called" << endl;
return ret;
}
};
TEST(TmplClassFnOverload, Test) {
A<double> a;
A<double> b;
double c;
a * b;
a * c;
}
a_rt
コンパイラが と を使用してテンプレートをインスタンス化しようdouble
としているため、コードはコンパイルに失敗しますA<double>
。コンパイラーはより特殊化されたものを選択する必要があるため、引数としてのみインスタンス化されるため、内部で何が起こっているのかわかりoperator*(A<double>&)
ませんa_rt
。<double, double>
これがうまくいかない理由を教えてください。これが制限である場合、これを回避するにはどうすればよいですか。
ありがとうございます!
unittest.cpp: In instantiation of 'a_rt<double, A<double> >':
unittest.cpp:198: instantiated from here
unittest.cpp:174: error: no type named 'type' in 'struct rt<double, A<double> >'
アップデート
コンパイラは次の変更に満足しているようです。ここで見逃している微妙な点があります。どちらの場合もコンパイラが何をしているのかを説明してくれる人に感謝します。
template<typename T2>
A<typename rt<T,T2>::type> operator*(const T2& val) const {
A<typename rt<T,T2>::type> ret;
cout << "T2& called" << endl;
return ret;
}
template<typename T2>
A<typename rt<T,T2>::type> operator*(const A<T2>& val) const {
A<typename rt<T,T2>::type> ret;
cout << "A<T2>& called" << endl;
return ret;
}