Das folgende Beispiel definiert eine grundlegende Podtype- Container-Klasse. Unter Verwendung dieser Klasse wird dann eine Reihe von typedefs erzeugt, die eine OOP-Version des grundlegenden podtype darstellen. Das Problem entsteht, wenn wir beginnen, diese Typen einander zuzuweisen.C++ - Template-Operator, der mit verschiedenen Typen überlädt
Ich habe versucht, den Operator als Freund Methode mit LHS und RHs Argumente mit einfachen PodObjects als Typ, aber ohne Erfolg zu definieren. Gibt es jemanden, der etwas Ähnliches erlebt hat oder eine andere Lösung für dieses Problem kennt?
Vielen Dank im Voraus.
#include <stdint.h>
template <typename T>
class PodObject {
protected:
T _value;
public:
PodObject<T>(int rhs) {
this->_value = static_cast<T>(rhs);
}
PodObject<T> operator+= (PodObject<T> const &rhs){
this->_value = rhs._value;
return *this;
}
};
typedef PodObject<int8_t> Int8;
typedef PodObject<int16_t> Int16;
int main() {
Int16 a = 10;
Int8 b = 15;
a += b; // Source of problem
return 0;
}
Ergebnisse in einem Compiler Ausgabe:
example.cpp:26:11: error: no viable overloaded '+='
a += b;
~^~
example.cpp:13:22: note: candidate function not viable: no known conversion from 'Int8' (aka 'PodObject<int8_t>') to 'const PodObject<short>'
for 1st argument
PodObject<T> operator+= (PodObject<T> const &rhs){
EDIT:
Der Freund Methode der Job für mich unten hat:
template<typename U, typename W>
friend PodObject<U> operator+= (PodObject<U> &lhs, PodObject<W> const &rhs) {
lhs._value += rhs._value;
return lhs;
}
+1 für "nicht sinnvoll, nicht nützlich". –
Es war mehr ein Experiment als etwas vernünftig, und ja, ich werde in die Hölle der Programmierer gehen :). Aber danke für die Antwort, die Mitgliedervariable muss jedoch öffentlich sein, damit dies funktioniert. – Roy
Die Member-Variable muss nicht "public" sein, wenn Sie sich 'PodObject'-Freunde von einander machen:' template friend PodObject ; 'P.S. Sie gehen nur zur Hölle des Programmierers, wenn Sie diesen Code wirklich liefern. –