2010-02-19 5 views
8

I einen Konstruktor der Form haben:Verhindern implizite Umwandlung von numerischen Typen in Konstruktor in C++

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

und es wird mit dem Code wie folgt aufgerufen:

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

Ich möchte diese automatische Konvertierung von Double zu Int verhindern, oder zumindest Warnungen zur Kompilierzeit erhalten.

Es scheint, dass das "explizite" Schlüsselwort in diesen Fällen nicht funktioniert, oder?

+2

Eine Besetzung ist explizit per Definition. Sie meinen "implizite Konvertierung" im Titel. –

Antwort

9

Was ist Ihr Compiler? Unter gcc können Sie -Wconversion verwenden, um Sie über diese Arten von Conversions zu warnen.

+0

Ich benutze gcc, und die -Wconversion hat funktioniert! Ich dachte, die -Wall würde dies beinhalten, aber anscheinend nicht! Vielen Dank! – Hugo

+2

-Wand fehlt viele Dinge und nicht einmal -Wall -Wextra enthält alles. Ich würde es vorziehen, einen Schalter zu haben, um wirklich alle Warnungen zu aktivieren und dann diejenigen, die Probleme verursachen, nacheinander auszuschalten. – Tronic

+1

Persönlich kompiliere ich mit '-Wall -Wextra -pedantisch -Wformat = 2 -Werstrict-overflow = 3 -Werror'. Ich füge während der Entwicklung "-nicht-unbenutzt" hinzu, weil ich oft Dinge habe, für die ich noch nicht bereit bin, aber ich möchte sie da drin haben, weil ich weiß, dass ich sie brauchen werde. –

2

Deklarieren Sie einen privaten MyClass(double a, double b, double c) Konstruktor.

5

Deklarieren Sie einen privaten Konstruktor wie folgt aus:

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

dass eine Kompilierung Fehler für jede Konstruktion verursachen 3 Parameter verwenden, die nicht alle int sind, und es ist tragbar.

+0

Das ist schlau. :-) Die warnende Lösung ist ein wenig sauberer, aber Ihre Lösung funktioniert mit jedem passenden Compiler. :-) Leider schützt es nicht vor der Klasse, die Instanzen von sich selbst direkt baut. Sie müssen warten, bis die Zeit abgelaufen ist. – Omnifarious

+0

@Onmifarious: Mit C++ 0x markieren Sie diese Überladung einfach mit '= delete;' Wenn Sie sich sonst Sorgen über internen Missbrauch machten, könnten Sie eine Implementierung bereitstellen, die nicht kompiliert werden kann (z. B. wegen statischer Assertion). – visitor

+0

Cleverer: fügen Sie eine zweite Überladung 'Vorlage MyClass (P1, P2, P3, P3 * Dummy = 0);'. Die Überladungsauflösung zwischen den beiden Vorlagen ist mehrdeutig, aber dies ist irrelevant, wenn beide schlechter sind als 'MyClass (int, int, int)' – MSalters

Verwandte Themen