2010-02-19 8 views
8

j'ai un constructeur de la forme:Prévention coulée implicite de types numériques dans le constructeur en C++

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

et il est appelé avec le code comme ceci:

MyClass mon_objet (4,0, 3,14, 0,002);

Je voudrais empêcher cette conversion automatique de double en int, ou au moins obtenir des avertissements au moment de la compilation.

Il semble que le mot-clé "explicite" ne fonctionne pas dans ce cas, non?

+2

Une distribution est explicite par définition. Vous voulez dire "conversion implicite" dans le titre. –

Répondre

9

Quel est votre compilateur? Sous gcc, vous pouvez utiliser -Wconversion pour vous avertir de ces types de conversions.

+0

J'utilise gcc, et le -Wconversion a fonctionné! Je pensais que le -Wall inclurait ceci, mais apparemment ce n'est pas le cas! Merci beaucoup! – Hugo

+2

-Wall manque beaucoup de choses et même pas -Wall -Wextra comprend tout. Je préférerais avoir un interrupteur pour vraiment activer tous les avertissements, puis désactiver ceux qui causent des problèmes un par un. – Tronic

+1

Personnellement, je compile avec '-Wall -Wextra -pedantic -Wformat = 2 -Wstrict-overflow = 3 -Werror'. J'ajoute '-Wno-unused' pendant le développement parce que j'ai souvent des choses que je ne suis pas encore prêt à utiliser, mais je les veux parce que je sais que j'en aurai besoin. –

2

Déclarez un constructeur privé MyClass(double a, double b, double c).

5

un constructeur privé Déclarez comme ceci:

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

Cela provoque une erreur de compilation pour toute construction à l'aide de 3 paramètres qui ne sont pas tous int, et il est portable.

+0

C'est intelligent. :-) La solution d'alerte est un peu plus propre, mais votre solution fonctionne sur n'importe quel compilateur conforme. :-) Malheureusement, il ne protège pas contre les instances de construction de classe de lui-même directement. Vous devez attendre le temps de liaison pour les attraper. – Omnifarious

+0

@Omnifarious: Avec C++ 0x, vous marqueriez simplement cette surcharge avec '= delete;' Sinon, si vous vous inquiétiez d'une mauvaise utilisation interne, vous pourriez fournir une implémentation qui échoue à compiler (par exemple à cause d'une assertion statique). – visitor

+0

Cleverer: ajouter une deuxième surcharge 'template MyClass (P1, P2, P3, P3 * dummy = 0);'. La résolution de surcharge entre les deux modèles sera ambiguë, mais cela n'a aucune importance si les deux sont plus mauvais que 'MyClass (int, int, int)' – MSalters