Ich implementiere einige Klassen für lineare Algebra-Operationen auf sehr kleinen Vektor und Matrizen mit konstanter Größe. Currenty, wenn ich tun:C++ automatische Typumwandlung: falsches Verhalten für eine Container-Klasse
MyMathVector<int, 3> a ={1, 2, 3};
MyMathVector<double, 3> b ={1.3, 2.3, 3.3};
std::cout<<"First = "<<a+b<<std::endl;
std::cout<<"Second = "<<b+a<<std::endl;
Dann First = {2, 4, 6}
und Second = {2.3, 4.3, 6.3}
, da das zweite Element auf das erste Element Typ vom Compiler gegossen. Gibt es eine "einfache" Möglichkeit, die gleiche Art von automatischem Casting wie in nativem C++ bereitzustellen: int + double = double, double + int = double?
Vielen Dank.
EDIT: Mit der Syntax aus Antworten, bekam ich den Operator + arbeiten. Aber ich habe versucht die folgende Syntax und die Zusammenstellung nicht mit dem Fehler: expected a type, got ‘std::common_type<T, TRHS>::type’
#include <iostream>
#include <type_traits>
template<class T> class MyClass
{
public:
MyClass(const T& n) : _n(n) {;}
template<class TRHS> MyClass<typename std::common_type<T, TRHS>::type> myFunction(const MyClass<TRHS>& rhs)
{
return MyClass<std::common_type<T, TRHS>::type>(_n*2+rhs._n);
}
T _n;
};
int main()
{
MyClass<double> a(3);
MyClass<int> b(5);
std::cout<<(a.myFunction(b))._n<<std::endl;
}
Was ist das Problem dieser Syntax?
Great! Für den Operator + funktioniert diese Syntax gut, aber sie stürzt für andere Funktionen ab, die ein Klassenmitglied sein müssen. Wie lautet die Syntax für eine Klassenmemberfunktion, wobei T der Klassentyp und TRHS der Typ des übergebenen Parameters ist? – Vincent
@ Vincent bearbeitet Antwort entsprechend, anscheinend können Sie keine Code-Blöcke in Kommentaren setzen. –
Vielen Dank. Ich habe die ursprüngliche Frage bearbeitet, weil ich den Syntaxfehler in dem bereitgestellten Stück Code nicht sehe ... – Vincent