2011-12-12 6 views
6

以下のコードは、-std=c++0xスイッチを使用してg ++バージョン4.5.0でコンパイルできません。私は、次のエラーメッセージが表示されます。g ++ 4.5のstd :: complexのコピー割り当て - 'operator +'の一致なし

error: no match for 'operator+' in 'std::pow [with _Tp = float, _Up = int, typename __gnu_cxx::__promote_2<_Tp, _Up>::__type = double](((const std::complex<float>&)((const std::complex<float>*)(& x))), ((const int&)((const int*)(&2)))) + y' 

私は、これはアサイナブル要件はhereを述べに関連すると考えています。複合語のための私自身のコピー代入演算子を定義する必要がありますか?もしそうなら、どうですか? complexが関与しているとき

#include <complex> 
using namespace std; 

int main(int argc, char *argv[]) { 
    complex<float> x,y; 
    x = pow(x,2);  // ok 
    x = x  + y; // ok 
    x = pow(x,2) + y; // error 
    return 0; 
} 
+2

エラーは簡略化されています。「演算子+は複雑なものです。と複合体」 – Cubbi

+0

@parapura rajkumar:残念ながらそれはありません。 – user2023370

+0

これは、VS2010でコンパイルするとおそらくtemplateまたはtypenameキーワードが必要です。 – AJG85

答えて

11

[cmplx.over]/P3はpowのための追加のオーバーロードを指定しています

関数テンプレートPOWは、少なくとも一つの引数で呼び出しのために、確実 に十分な追加のオーバーロードをもたなければなりませんタイプcomplex<T>の:

  1. いずれかの引数がcomplex<long double>やタイプを入力した場合10の場合、両方の引数は効果的にcomplex<long double>にキャストされます。どちらかの引数がcomplex<double>double、または整数型の型を持つ場合

  2. そうでない場合は、両方の引数が効果的 complex<double>にキャストされています。

  3. いずれかの引数の型がcomplex<float>またはfloatの場合、両方の引数は効果的にcomplex<float>にキャストされます。

2は、二重に昇格され、そしてpow(complex<float>, double)complex<double>を返します。

+0

+1。エラーを見た後、私はこれを期待していた。 – Nawaz

+3

追加の詳細:C++ 03との違いは、この欠陥レポートに遡ることができます。http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#844 - 削除しました追加のオーバーロード:テンプレート複合体 pow(const complex &x、int y); – wolfgang

+1

ありがとう、ありがとう。 C++ 03では、同じ 'pow(x、2)'は 'complex 'の代わりに 'complex 'を返しました。複合体と複合体の間には演算子+がありませんでした。 – user2023370

関連する問題