2011-02-23 68 views
0

下面的代碼的類型是鑄造誤差爲什麼類型鑄造在這裏不起作用?

#define IMG_I (std::complex<double>(0, 1)) 
#define PI 3.1415926535 
for (unsigned long int j = 0; j < 10; ++j) 
    std::cout << exp(-IMG_I * PI * j); 

類型鑄件可以通過使用額外的括號或改變乘法的順序可以容易地解決。但是我不清楚爲什麼類型轉換問題首先出現,爲什麼C++不能像上面那樣處理上面的代碼。

任何人都可以爲我解釋這個嗎?

+5

如何處理你遇到的錯誤。我懷疑編譯器可能與' - (std :: complex (0,1))'有關,但很難說沒有錯誤信息 – tloach 2011-02-23 19:10:45

+3

爲什麼不只是使用'const std :: complex IMG_I(0, 1);'? – 2011-02-23 19:17:12

+0

你的宏隱藏了一些隱式轉換爲不兼容的類型... – AJG85 2011-02-23 19:21:10

回答

8

operator*過載std::complex是一個聲明,看起來像一個函數模板:

template<typename T> 
complex<T> operator*(const complex<T>& lhs, const T& val); 

complex<T>Tlhs參數必須是一樣的Tval參數,以便模板論證扣除工作。

您正在嘗試用std::complex<double>-IMG_I * PI的類型)和unsigned longj的類型)來調用它。 doubleunsigned long不是相同的類型,所以模板參數推導失敗。

-IMG_I * (PI * j)工作原因是PI * j的類型是double,所以T是什麼也沒有歧義。同樣,-IMG_I * PI * static_cast<double>(j)也有相同的原因。

+0

希望我能給+2的'static_cast (j)' – AJG85 2011-02-23 19:38:31

0

如果你看一下頭文件定義複雜:

template
inline complex<_Tp>
operator*(const complex<_Tp>& __x, const _Tp& __y)
{
complex<_Tp> __r = __x;
__r *= __y;
return __r;
}

你會看到,而不是接受_Tp(在這種情況下,雙),第二個參數是一個const _Tp&。這意味着C++不願意從整數j執行隱式強制轉換,因此是錯誤。

如果第二個參數被重寫爲_Tp,則C++的內置隱式類型轉換會將該整數轉換爲double,並且您的代碼將被編譯。

+0

這是不正確的:如果我們沒有參數扣除失敗(例如,如果參數的類型爲「complex '和'U'),將從'unsigned long'創建一個臨時的'double',並且該臨時可以傳遞給'operator *'。只有當參數是一個非const引用('T&'而不是'const T&')時,它才能綁定到臨時對象。 – 2011-02-23 20:32:18

+0

我的不好。你說得很對。 – 2011-02-23 22:03:44

相關問題