Ich versuche, eine antike C++ - Code-Basis von gcc 3.2 auf gcc 4.1 zu verschieben, da ich ein paar Probleme habe. Von all den Problemen bleibt mir Folgendes ahnungslos (ich denke ich habe zu viel Zeit mit Java verbracht oder ich habe die Grundlagen von C++ vergessen :-P).C++ Operator Überladung Auflösung Ambiguität
Ich habe eine Template-Klasse
template < class T > class XVector <T>
{
...
template < class T > T
XVector <T>::getIncrement()
{
...
}
template < class T > int
XVector <T>::getValue (size_t index, T& value)
{
...
//The problematic line
value = (T) (first_value + getIncrement())
* (long) (index - first_index);
....
}
}
Diese Klasse auf der STL std basiert :: vector. Ich habe eine zweite Klasse TypeValue und seine wie folgt definiert, die eine der int, long und ihre vorzeichenlosen Varianten float, double, std :: string enthalten können. Überlastet auch fast alle möglichen Betreiber.
class TypeValue
{
union
{
long* _int_value;
double* _real_value;
string* _text_value;
} _value;
TypeValue();
explicit TypeValue(long _long);
explicit TypeValue(int _int);
explicit TypeValue(unsigned long _ulong);
...
//similarly for all the remaining supported types.
TypeValue(const TypeValue&) //Copy constructor
virtual TypeValue& operator=(const TypeValue &rhs);
TypeValue& operator+ (TypeValue&)const;
TypeValue& operator* (TypeValue&)const;
...
//For all the basic operators
operator long() const;
operator int() const;
operator unsigned long() const;
operator unsigned int() const;
...
}
Und schließlich ich eine andere Klasse, nennen wir es die build_breaker, die ein Objekt als XVector <TypeValue> a_variable;
schafft. Wenn ich das nun auf gcc 3.2 kompiliere, kompiliert das ohne Probleme. Aber wenn ich versuche, diese auf gcc kompilieren 4.1 bekomme ich Fehler mehrdeutig Überlastung für operator*
in der Klasse XVector
sagen, und die Kandidaten
operator*(long int, long int) operator*(int, long int) operator*(long unsigned int, long int) operator*(unsigned int, long int) operator*(double, long int) operator*(float, long int)
wird, wenn der Compiler sagte, es hatte Probleme ein Spiel für T zu finden * lang, das hätte hat Sinn gemacht, aber warum versucht es, es in den nativen Typ zu schreiben und dann die arithmetische Operation durchzuführen? Bitte helfen Sie mir dabei.
Vielen Dank im Voraus.
Ihre arithmetischen Operatoren sollten const-Referenzen akzeptieren und zurückgeben, da sie const-Funktionen sind. Ihr Zuweisungsoperator sollte eine const-Referenz akzeptieren, aber die Methode selbst ist nicht sehr sinnvoll. Es ist ein Zuweisungsoperator, also sollte er das ändern, von dem Sie ihn nennen. –
Geringfügige Korrektur, der Zuweisungsoperator wird als
deklariert. Es ist kein reines virtuelles, sondern hat eine Methodendefinition. – cx0derNicht "korrigieren" Sie es in den Kommentaren. Korrigiere es richtig, indem du deine Frage redest und richtig machst. Und wenn Sie das tun, denken Sie bitte auch daran, dass wir "SdmsTypedValue" noch nie zuvor gesehen haben. Dies ist der erste, den du diesen Typ erwähnt hast. –