8

次のコードはコンパイルに失敗します

#include <iostream>
#include <cmath>
#include <complex>

using namespace std;

int main(void)
{
    const double b=3;
    complex <double> i(0, 1), comp;

    comp = b*i;

    comp = 3*i;

    return 0;
}

エラー: '3 * i' の 'operator*' に一致しない b*i が動作します。

4

3 に答える 3

7

最初の行で:

comp = b*i;

コンパイラーは以下を呼び出します。

template<class T> complex<T> operator*(const T& val, const complex<T>& rhs);

次のようにインスタンス化されます。

template<> complex<double> operator*(const double& val, const complex<double>& rhs);

2 番目のケースでは、適切な template がないintため、インスタンス化は失敗します。

comp = 3.0 * i; // no operator*(int, complex<double>)
于 2010-04-15T18:18:21.957 に答える
4

複雑な演算子の概要については、http://www.cplusplus.com/reference/std/complex/complex/operators/を参照してください。

operator* はテンプレートであり、複雑なクラスのテンプレート パラメーターを使用してそのコードを生成します。operator* の呼び出しに使用する数値リテラルは int 型です。使用するcomp = 3. * i;

于 2010-04-15T18:17:19.150 に答える