2017-05-19 1 views
1

Ich versuche, einige Operatoren für die "sf :: Vector2" Template-Klassen der sfml-Bibliothek zu schreiben (die im Grunde nur einen x- und y-Parameter des angegebenen Typs enthalten). Ich muss die grundlegenden arithmetischen Operatoren bezüglich "Vektor-Vektor" und "Vektor-Skalar/Skalar-Vektor" Interaktionen implementieren. Hier ist ein Beispiel dafür, was ich getan hätte bisher (Multiplikationsoperator):Vorlage Funktion Überladung Auflösung mit sfml Vektoren

//multiply vectors 
template<typename TResult, typename TLeft, typename TRight> 
inline auto operator*(const sf::Vector2<TLeft>& lhs, const sf::Vector2<TRight>& rhs){ 
    return sf::Vector2<TResult>(lhs.x * rhs.x, lhs.y * rhs.y); 
} 
//multiply sf vector and scalar 
template<typename VT, typename ST> 
inline auto operator*(const sf::Vector2<VT>& vect, const ST& scalar) { 
    return sf::Vector2<VT>(vect.x * scalar, vect.y * scalar); 
} 
template<typename VT, typename ST> 
inline auto operator*(const ST& scalar, const sf::Vector2<VT>& vect) { 
    return vect * scalar; 
} 

Das Problem ist, dass wenn ich versuche, einen Operator zu berufen, wie dies:

sf::Vector2<int> v1, v2; 
sf::Vector2<int> v3 = v1 * v2; 

Die zweite Version des Ein solcher Operator (derjenige, der den Skalar enthält) wird vom Compiler verwendet, und als Konsequenz wird ein Fehler erzeugt. Ich dachte, dass dies nicht passieren würde, und dass der Compiler die erste Version des Operators aufgrund der Überladungsauflösung berücksichtigt hätte (die Funktion akzeptiert zwei Vektoren anstelle eines Vektors und eines generischen Typs). Was verstehe ich nicht?

Antwort

1

In Ihrer Vektormultiplikationsüberladung kann der Vorlagenparameter TResult nicht abgeleitet werden. Sie können dieses Problem lösen, indem Sie std::common_type_t:

template<typename TLeft, typename TRight> 
inline auto operator*(const sf::Vector2<TLeft>& lhs, const sf::Vector2<TRight>& rhs){ 
    return sf::Vector2<std::common_type_t<TLeft, TRight>>(lhs.x * rhs.x, lhs.y * rhs.y); 
} 
verwenden
Verwandte Themen