C ++ Fehler ohne Benutzerdefinition

7

Ich portiere gerade eine C ++ - Anwendung in eine leicht eingeschränkte Umgebung. Die Anwendung verwendet die Klassen STL, string und stream. Ich überarbeite vereinfachte Versionen von diesen, die gut in meiner Umgebung spielen werden.

Was mir Sorgen bereitet, ist, dass meine Anwendung auch ohne die notwendigen Operatordefinitionen kompiliert wird. Zum Beispiel habe ich für meine String-Klassen definiert:

%Vor%

und das war genug. Ich bemerkte jedoch, dass es Fälle gab, die mystring + "eine konstante Zeichenfolge" hatten und dies ist nirgends in meinem Code definiert. Als ich es explizit hinzugefügt habe, wurde es verwendet:

%Vor%

Was ist vorher passiert? Es kompilierte erfolgreich, bevor ich die zweite Funktion hinzufügte. Sicher würde der Compiler nicht in der Lage sein, zu schließen, wie man C-Style-Strings mit meiner String-Klasse verkettet.

Ich bekomme jetzt seltsames Verhalten in meinem Programm und ich frage mich, ob es an anderen nicht definierten Operatoren liegt. Gibt es eine Möglichkeit, den Compiler zu zwingen, solche Operatordefinitionen zu verlangen, wenn es vom Programm benötigt wird?

P.S. Meine String-Klasse befindet sich in einem eindeutigen Namespace und steht in keinem Zusammenhang mit std ::

    
hayesti 20.10.2011, 19:10
quelle

5 Antworten

12

Es ist unmöglich, sicher zu sein, ohne den Rest Ihres Codes zu sehen, aber in diesem Fall ist es wahrscheinlich auch nicht schwer zu erraten. Sie haben fast sicher einen Konstruktor für Ihr string , der einen char const * als Parameter verwendet. Was also passiert, ist, dass der Compiler dieses ctor verwendet, um char const * in ein string zu konvertieren und dann string operator+ (const string& lhs, const string& rhs); zu verwenden Verketten Sie das.

Dies zuzulassen, ist einer der Hauptgründe (wenn nicht der ), diese Operatoren mit globalen anstelle von Elementfunktionen zu überladen. Als Member-Funktionen können sie den rechten Operanden konvertieren, nicht aber den linken.

    
Jerry Coffin 20.10.2011, 19:16
quelle
2

Wenn Sie eine const char* übergeben haben, wurde wahrscheinlich ein Zeichenfolgenobjekt erstellt und an Operator + übergeben. Wenn Sie den Code in einem Debugger durchgehen, können Sie wahrscheinlich feststellen, dass der Konstruktor aufgerufen wird.

    
Dabbler 20.10.2011 19:15
quelle
2

Sie haben wahrscheinlich einen Konstruktor in Ihrer Klasse, der const char * als Eingabeparameter verwendet. Wahrscheinlich wird dieser Konstruktor für implizite Coverversionen und das seltsame Verhalten verwendet, das Sie sehen.

Deklarieren Sie Ihren Konstruktor, der const char * als explicit akzeptiert. Dadurch wird die Verwendung für implizite Konvertierungen deaktiviert, wenn Sie nicht beabsichtigen, sie zu verwenden.

    
Alok Save 20.10.2011 19:16
quelle
2

Hat Ihre 'string' Klasse einen Konstruktor mit einem Argument, der ein const char * akzeptiert? Ist dieser Konstruktor für einzelne Argumente als 'explizit' markiert?

Wenn es nicht explizit ist, lautet die wahrscheinlichste Antwort, dass der Compiler über den konvertierenden Konstruktor ein temporäres String-Objekt aus char * konstruiert und dann diese temporäre Zeichenfolge verwendet, um den Additionsoperator für zwei Argumente aufzurufen.

>     
acm 20.10.2011 19:16
quelle
1

Der Compiler kann nicht wissen, wie Sie Ihre Zeichenfolge in ein std::string oder char* konvertieren können, wenn Sie nicht angeben, wie.

Suchen Sie in Ihrer Klassendeklaration nach Umwandlungskonstruktoren oder Umwandlungsoperatoren.

%Vor%

Diese werden implizit aufgerufen.

Sie können das Schlüsselwort explicit für Ihren Konstruktor angeben, um dies zu verhindern.

Wenn das Problem dadurch nicht gelöst wird, müssen Sie die Operatoren irgendwo überladen haben, am besten finden Sie sie mit einem Debugger durch den Code.

    
Luchian Grigore 20.10.2011 19:17
quelle