2010-02-19 9 views
8

Tengo un constructor de la forma:Prevención de conversión implícita de tipos numéricos en el constructor en C++

MyClass (int a, int b, int c);

y es llamado con el código de la siguiente manera:

MiClase mi_objeto (4,0, 3,14, 0,002);

Me gustaría evitar esta conversión automática de doble a int, o al menos recibir advertencias en tiempo de compilación.

Parece que la palabra clave "explícita" no funciona en estos casos, ¿verdad?

+2

Un elenco es explícito por definición. Quiere decir "conversión implícita" en el título. –

Respuesta

9

¿Cuál es su compilador? En gcc, puede usar -Wconversion para advertirle sobre este tipo de conversiones.

+0

¡Utilizo gcc y la -Wconversion funcionó! Pensé que -Wall incluiría esto, ¡pero aparentemente no es así! ¡Muchas gracias! – Hugo

+2

-Wall carece de muchas cosas y ni siquiera -Wall -Wextra incluye todo. Preferiría tener un interruptor para activar realmente todas las advertencias y luego desactivar las que están causando problemas uno por uno. – Tronic

+1

Personalmente, compilo con '-Wall -Wextra -pedantic -Wformat = 2 -Wstrict-overflow = 3 -Werror'. Agregué '-Wno-sin usar' durante el desarrollo porque a menudo tengo cosas que aún no estoy lista para usar, pero las quiero allí porque sé que las necesitaré. –

2

Declare un constructor privado MyClass(double a, double b, double c).

5

declarar un constructor privado como esto:

private: 
template <class P1, class P2, class P3> 
MyClass(P1,P2,P3); 

que provocará un error de tiempo de compilación para cualquier construcción mediante 3 parámetros que no son todos int, y es portátil.

+0

Eso es inteligente. :-) La solución de advertencia es un poco más limpia, pero su solución funciona en cualquier compilador conforme. :-) Desafortunadamente no protege contra la construcción de instancias de sí mismo directamente. Tienes que esperar hasta el momento del enlace para atraparlos. – Omnifarious

+0

@Omnifarious: con C++ 0x simplemente marcaría esta sobrecarga con '= delete;' De lo contrario, si estuviera preocupado por el mal uso interno, podría proporcionar una implementación que no compila (por ejemplo, debido a la aserción estática). – visitor

+0

Cleverer: agregue una segunda plantilla de sobrecarga MyClass (P1, P2, P3, P3 * dummy = 0); '. La resolución de sobrecarga entre las dos plantillas será ambigua, pero esto es irrelevante si ambas son peores que 'MyClass (int, int, int)' – MSalters

Cuestiones relacionadas