2011-12-12 68 views
6

以下代碼無法使用-std=c++0x開關在g ++版本4.5.0中進行編譯。我收到以下錯誤信息:C++在g ++中爲std :: complex 11複製分配4.5 - 與'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。我是否應該爲複雜的定義自己的複製賦值運算符?如果是這樣,怎麼樣?

#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編譯可能需要模板或typename關鍵字。 – AJG85

回答

11

[cmplx.over]/P3指定附加重載powcomplex涉及:

功能模板POW應具有足夠的附加重載到 確保,對於一個呼叫與至少一個參數complex<T>類型:

  1. 如果兩個參數的類型爲complex<long double>或鍵入long double,那麼這兩個參數都被有效地轉換爲complex<long double>

  2. 否則,如果任一參數的類型爲complex<double>double或整數類型,則這兩個參數被有效地轉換爲 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 - 它們已被刪除額外的過載:template complex pow(const complex &x,int y); – wolfgang

+1

我明白了,謝謝。在C++ 03中,相同的'pow(x,2)'返回了一個'​​complex '而不是'complex ';而在複雜的和複雜的之間從來沒有過「操作符+」。 – user2023370