web-dev-qa-db-ja.com

関数の引数で使用される複素リテラル 'i'

_std::complex_を使用してC++で literal i を使用すると、問題があるようです。

次のコードについて考えてみます。

_std::complex<double> a = -1.0i * 42.0;
std::complex<double> b = a + 1.0i;
_

2行目は次のコマンドでコンパイルに失敗します:error: no match for ‘operator+’ (operand types are ‘std::complex<double>’ and ‘__complex__ double’)

これは、関数呼び出しで複雑なリテラルを使用する場合にも表示されます。

_std::exp<std::complex<double>>( 1.0i * 3.14159 );
_

複雑なリテラル_1.0i_が_std::complex<double>_に変換できないのはなぜですか?

_std::complex_で_1.0i_を明示的に作成する必要がありますか?

20
Louen

iサフィックスと gcc extension の競合を避けるために、--std=c++14(no GNU ext)で再コンパイルする必要があります。

ISO C++ 14ライブラリは「i」サフィックスも定義しているため、<complex>ヘッダーを含むC++ 14コードはGNU拡張子に 'i'を使用できません。 'j'サフィックスにはまだGNUの意味があります。

24
VTT