2011-06-30 17 views
9

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

+8

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ć. –

+0

Może potrzebujesz 'wyciszania' na swojej platformie? –

+1

@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. –

Odpowiedz

9

wygląda na problem z argumentem domyślnym szablonie i konwersję pomiędzy podwójne i pływaka. Problem nie występuje, jeśli nie używasz szablonów.

Trzymaj "f" na końcu tego domyślnego argumentu szablonu, tak aby traktował wartość jako "zmienną" zamiast podwójną. Wydaje się, że to naprawia.

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

Ale po zastosowaniu powyższej naprawić, jeśli deklarują to

fun<double>() 

uzyskać równoważną błąd. Więc lepiej fix, który pracuje dla obu pływaków i podwaja jest użycie obsady następująco:

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

Co do tego, czy jest to błąd kompilatora lub „niezdefiniowane zachowanie”, dam guru kompilatora kurant.

+1

Nie jest złą odpowiedzią i dodaje trochę więcej do wcześniejszych komentarzy, ale wciąż -1, nawet nie potwierdzając wglądu Hansa i Kerreka ... –

+1

@ Tony: Ta odpowiedź jest całkowicie moja. Podczas pisania odpowiedzi i sprawdzania poprawności rozwiązania nie mogłem zobaczyć komentarzy. S.O. Poinformuje Cię o innych przesłanych odpowiedziach podczas pisania własnego. Ale nie możesz zobaczyć nowych komentarzy, dopóki nie opublikujesz postów. I tak, nienawidzę tego, gdy ludzie kradną moje odpowiedzi i dostaną kredyt. Ale to jest uczciwy błąd. – selbie

+0

cóż, mój błąd jest wtedy ... Byłbym "-1 do +1", ale nie może, chyba że twoja odpowiedź jest edytowana. I przeprosiny ...! Twoje zdrowie. –

Powiązane problemy