これは機能します:
#include <complex>
#include <iostream>
int main()
{
std::complex<double> z(0,2);
double n = 3.0; // Note, double
std::cout << z * n << std::endl;
}
複合体はdoubleで構成されているため、doubleで乗算されます。宣言を見てください:
template <typename T>
inline complex<T> operator*(const complex<T>&, const T&);
(以下はdribeasのおかげです)コンパイラはテンプレートの推論中に暗黙の型変換を行うことを許可されていないため、Tを次のように扱う関数と一致させようとすると、complex
Tがでdouble
、次に別のTがが渡されます。不一致、およびその逆。int
double
作業したいものについては、次のように定義された関数が必要になります。
template <typename T, typename U>
inline std::complex<T> operator*(std::complex<T> lhs, const U& rhs)
{
return lhs *= rhs;
}
これにより、関数はさまざまな型をとることができ、を呼び出すときにキャストを実行できますoperator*=
。