2017-05-19 9 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

벡터 곱셈 오버로드에서 템플릿 매개 변수 TResult을 추론 할 수 없습니다. std::common_type_t :

을 사용하여이 문제를 해결할 수 있습니다.