mam pewne problemy z używaniem domyślny argument typu float:Domyślny argument typu float = bełkot
#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;
}
drukuje -1.36867e-033 zamiast równoważności 1E-05. Co tu się dzieje?
Używam VC++ 10.
Edit1:
Dziękuję wszystkim za odpowiedzi. Ale odlewania domyślny argumentu nie działa w następujących przypadkach:
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;
}
więc jest to na pewno warto i raportowanie błędów?
EDIT2:
Reported this issue to Microsoft
Oczekujesz, że kompilator wyśle konwersję z podwójnego na zmiennoprzecinkowe. Tak nie jest. Użycie "1e-5f" naprawia to. Użyj strony connect.microsoft.com, aby to zgłosić. –
Może potrzebujesz 'wyciszania' na swojej platformie? –
@Hans: Subtle. Miałem zamiar zasugerować 'zabawę (T t = T (1e-05))' ale myślałem, że to nie będzie konieczne ... Działa to dobrze na GCC 4.6 przy okazji. –