使用sfml向量进行模板函数重载解析

时间:2017-05-19 22:14:20

标签: c++ templates operator-overloading sfml

我试图为sfml库编写一些操作符" sf :: Vector2"模板类(基本上只包含指定类型的x和y参数)。我需要实现关于" Vector-Vector"的基本算术运算符。和" Vector-Scalar / Scalar-Vector"互动。这是我到目前为止所做的一个例子(乘法运算符):

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

问题在于,当我尝试调用运算符时,例如:

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

编译器使用此类运算符的第二个版本(涉及标量的运算符),因此会生成错误。我认为这不会发生,并且由于重载解析,编译器会考虑运算符的第一个版本(该函数接受两个向量而不是一个向量和泛型类型)。我不理解的是什么?

1 个答案:

答案 0 :(得分:1)

在向量乘法重载中,无法推导出模板参数TResult。您可以使用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);
}