2011-06-30 14 views
9

Tengo algunos problemas para usar un argumento por defecto de tipo float:Parámetros por defecto de tipo float = galimatías

#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; 
} 

Imprime -1.36867e-033 en lugar de la equivalencia de 1e-05. ¿Que esta pasando aqui?

Estoy usando VC++ 10.

EDIT1:

Gracias a todos por sus respuestas. Pero fundición del argumento predeterminado no funciona en los siguientes casos:

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; 
} 

Así que este es sin duda un error y digno de mención?

Edit2:

Reported this issue to Microsoft

+8

Está esperando que el compilador emita una conversión del doble al flotante. No es así Usar "1e-5f" lo arregla. Use connect.microsoft.com para informar esto. –

+0

¿Quizás necesites 'wcout' en tu plataforma? –

+1

@Hans: Sutil. Estaba a punto de sugerir 'diversión (T t = T (1e-05))' pero pensé que eso no sería necesario ... Por cierto, funciona bien en GCC 4.6. –

Respuesta

9

parece ser un problema con un argumento de plantilla por defecto y la conversión entre el doble y el flotador. El problema no ocurre si no estás usando plantillas.

Coloque una "f" al final de ese argumento de la plantilla por defecto de manera que trate el valor como un "flotante" en lugar de un doble. Eso parece arreglarlo.

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

Pero después de aplicar la revisión anterior, si se declara este

fun<double>() 

se obtiene una error equivalente. Por lo tanto una mejor solución que funcione para ambos flotadores y dobles es utilizar un molde de la siguiente manera:

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

En cuanto a si se trata de un error de compilador o "comportamiento indefinido", dejaré que los gurús del compilador interrumpiría.

+1

No es una mala respuesta, y agrega un poco más a los comentarios anteriores, pero aún -1 por no reconocer siquiera la percepción de Hans y Kerrek ... –

+1

@Tony: Esa respuesta es totalmente mía. Mientras redactaba mi respuesta y validaba la solución, no pude ver los comentarios. S.O. le notificará sobre otras respuestas enviadas mientras escribe la suya. Pero no puedes ver nuevos comentarios hasta después de que publiques. Y sí, odio cuando las personas roban mis respuestas y obtienen el crédito. Pero este es un error honesto. – selbie

+0

bueno, el error es mío entonces ... Yo tenía "-1 a +1" pero no puedo a menos que se edite tu respuesta. ¡Y disculpas ...! Aclamaciones. –

Cuestiones relacionadas