2017-05-19 2 views
1

J'essaye d'écrire des opérateurs pour les classes de modèle "sf :: Vector2" de la bibliothèque sfml (qui contiennent simplement un paramètre x et y du type spécifié). J'ai besoin de mettre en œuvre les opérateurs arithmétiques de base concernant les interactions "Vector-Vector" et "Vector-Scalar/Scalar-Vector". Voici un exemple de ce que je l'ai fait jusqu'à présent (opérateur de multiplication):Résolution de surcharge de fonction de modèle avec des vecteurs sfml

//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; 
} 

Le problème est que lorsque je tente d'invoquer un opérateur, comme celui-ci:

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

La deuxième version du un tel opérateur (celui impliquant le scalaire) est utilisé par le compilateur et, par conséquent, une erreur est générée. Je pensais que cela n'arriverait pas, et que le compilateur aurait considéré la première version de l'opérateur grâce à la résolution de surcharge (la fonction accepte deux vecteurs au lieu d'un vecteur et un type générique). Qu'est-ce que je ne comprends pas?

Répondre

1

Dans votre surcharge de multiplication vectorielle, le paramètre de modèle TResult ne peut pas être déduit. Vous pouvez résoudre ce problème en utilisant 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); 
}