2011-06-30 65 views
9

我有使用float類型的默認參數一些麻煩:float類型默認參數=亂碼

#include <wchar.h> 
#include <iostream> 

template<typename T> 
void fun(T t = 1e-05); 

template<typename T> inline 
void fun(T t) 
{ 
    std::cout << t << std::endl; 
} 

int wmain(int argc, wchar_t* argv[]) 
{ 
    fun<float>(); 

    _getwch(); 
    return 0; 
} 

它打印-1.36867e-033代替1E-05的等價的。這裏發生了什麼?

我正在使用VC++ 10。

EDIT1:

謝謝大家的回覆。 但鑄造默認參數並不在下列情況下工作:

template<typename T> 
void fun(T t = static_cast<T>(1e-05)); 

template<typename T> inline 
void fun(T t) 
{ 
    std::wcout << t << std::endl; 
} 

int wmain(int argc, wchar_t* argv[]) 
{ 
    fun<double>(); 
    fun<float>(); 

    _getwch(); 
    return 0; 
} 

所以這絕對是一個錯誤,值得報道?

EDIT2:

Reported this issue to Microsoft

+8

您期待編譯器發出從double到float的轉換。它沒有。使用「1e-5f」修復它。使用connect.microsoft.com報告此問題。 –

+0

也許你需要'wcout'在你的平臺上? –

+1

@Hans:微妙。我正要提出'有趣(T t = T(1e-05))',但認爲這不是必要的......順便說一下,它在GCC 4.6上運行良好。 –

回答

9

看起來是雙和浮動之間的默認模板參數和轉換的問題。如果您未使用模板,則不會發生此問題。

在該默認模板參數的末尾貼上「f」,以便將該值視爲「float」而不是double。這似乎解決了它。

template<typename T> 
void fun(T t = 1e-05f); 

但應用上述修復後,如果聲明此

fun<double>() 

你得到同等的bug。所以,更好的修復,對於這兩種花車和雙打的工作原理是如下使用強制:

template<typename T> 
void fun(T t = (T)(1e-05)); 

至於這是否是一個編譯器缺陷或「未定義的行爲」,我就讓編譯器大師插入內容。

+1

答案並不差,並且在之前的評論中增加了一些額外的內容,但仍然是-1,因爲它甚至不承認Hans和Kerrek的洞察力。 –

+1

@Tony:那個答案完全屬於我自己的。在我寫回答並驗證解決方案時,我無法看到評論。 S.O。將在您寫作時告知您其他提交的答案。但是直到您發佈後才能看到新的評論。是的,當人們竊取我的答案並獲得信貸時,我討厭它。但這是一個誠實的錯誤。 – selbie

+0

好吧,這個錯誤是我的...我會「-1到+1」,但不能除非你的答案被編輯。並道歉...!乾杯。 –