float = gibberish类型的默认参数

时间:2011-06-30 10:14:12

标签: c++ visual-studio visual-studio-2010 templates visual-c++

使用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

1 个答案:

答案 0 :(得分:9)

看起来是一个默认模板参数和double和float之间转换的问题。如果您不使用模板,则不会出现此问题。

在该默认模板参数的末尾粘贴“f”,使其将值视为“float”而不是double。这似乎解决了这个问题。

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

但是在应用上述修复后,如果你声明了这个

fun<double>()

你得到一个同等的错误。因此,一个适用于浮点数和双精度数的更好的修复方法是使用强制转换,如下所示:

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

至于这是编译器错误还是“未定义的行为”,我会让编译器大师们加入进来。