Nub*_*ase 9 c++ templates visual-studio-2010 visual-studio 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;
}
Run Code Online (Sandbox Code Playgroud)
它打印-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;
}
Run Code Online (Sandbox Code Playgroud)
所以这绝对是一个错误,值得报道?
EDIT2:
看起来是一个默认模板参数和double和float之间转换的问题.如果您不使用模板,则不会发生此问题.
在该默认模板参数的末尾粘贴一个"f",使其将该值视为"float"而不是double.这似乎解决了这个问题.
template<typename T>
void fun(T t = 1e-05f);
Run Code Online (Sandbox Code Playgroud)
但在应用上述修复后,如果您声明了这一点
fun<double>()
Run Code Online (Sandbox Code Playgroud)
你得到一个相同的错误.因此,一个适用于浮点数和双精度数的更好的修复方法是使用如下转换:
template<typename T>
void fun(T t = (T)(1e-05));
Run Code Online (Sandbox Code Playgroud)
至于这是一个编译器错误还是"未定义的行为",我将让编译器大师们加入进来.