2011-06-30 66 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”,但不能除非你的答案被编辑。并道歉...!干杯。 –