2017-05-19 18 views
1

sfmlライブラリの "sf :: Vector2"テンプレートクラス(基本的には指定された型のxとyパラメータのみを含む)の演算子をいくつか記述しようとしています。私は "Vector-Vector"と "Vector-Scalar/Scalar-Vector"の両方のインタラクションに関する基本的な算術演算子を実装する必要があります。ここで私はこれまでのところ(乗算演算子)やったことの一例です:テンプレート関数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; 
} 

問題は、私はこのような、オペレータを起動しようとすることです:

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

の第二のバージョンそのような演算子(スカラを含むオペレータ)がコンパイラによって使用され、結果としてエラーが生成されます。私は、これは起こらないだろうと思って、コンパイラは過負荷解決のおかげで演算子の最初のバージョンを考慮していたでしょう(この関数は1つのベクトルとジェネリック型の代わりに2つのベクトルを受け取ります)。私は何を理解していないのですか?

答えて

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); 
} 
を使用してこの問題を解決できます
関連する問題