2013-06-16 5 views
2

클래스 템플릿에 ScalarClamped가 있습니다. 이 클래스의 인스턴스는 사용자가 지정한 값 범위를 가지며 할당 된 값이 범위를 벗어날 때마다 값이 사용자 정의 값 범위, 즉 "ScalarClamped"에 클램핑됩니다.C++ - 명시 적으로 템플릿 클래스 내에서 생성자 템플릿 호출?

ScalarClamped<float> scalar__(75, 0, 100); // Parameters: current value (75), minimum allowed value (0), maximum allowed value(100). 
scalar__ += 50; 
std::cout << scalar__.value() << std::endl; // Output: 100. 
scalar -= 150; 
std::cout << scalar__.value() << std::endl; // Output: 0. 

회원 기능 operator+을 구현할 때 문제가 발생했습니다. 당신이 볼 수 있듯이, 내가 템플릿 생성자를 호출하기 위해 노력하고있어

template<typename T> 
ScalarClamped<T> ScalarClamped<T>::operator+(ScalarClamped const& scalar_clamped_){ 
    return ScalarClamped<T>::ScalarClamped<T&&, T const&, T const&>(_m_tValue + scalar_clamped_._m_tValue, _m_tValueMin, _m_tValueMax); 
} 

: 여기에 하나 과부하 operator+의 구현입니다. 여기가 (물론 버그를 포함 할 수 있습니다 진행중인 작업) 구현의의 :

template<typename T> 
template<typename TypeValue, typename TypeMin, typename TypeMax> 
ScalarClamped<T>::ScalarClamped(TypeValue value_, TypeMin min_, TypeMax max_): 
    // Initialization list: 
    _m_tValue((std::is_lvalue_reference<TypeValue>::value) ? value_ : std::move(value_)), 
    _m_tValueMax((std::is_lvalue_reference<TypeMax>::value) ? max_ : std::move(max_)), 
    _m_tValueMin((std::is_lvalue_reference<TypeMin>::value) ? min_ : std::move(min_)) 
    // Function body: 
    { 
     Algorithm::clamp<T&, T const&, T const&>(_m_tValue, _m_tValueMin, _m_tValueMax); 
    } 

나를 위해 주요 문제는 내가 제대로이 생성자 템플릿을 호출 할 수 없습니다 해요 있다는 것입니다.

... error: dependent-name 'ScalarClamped<T>::ScalarClamped<T&&, const T&, const T&>' is parsed as a non-type, but instantiation yields a type| 

은 분명히 내가 길을 잘못 호출하려고 해요 : 나는 다음과 같은 오류 메시지 ( 단축)을 얻는다. 내 생성자 템플릿을 적절하게 호출하는 방법?

+0

명 정적 생성 방법을 사용하십시오 템플릿 을 ScalarClamped * ScalarClamped : (...) 만들기; 그런 다음 ScalarClamped :: Create (...); 유형을 지정합니다. – JRG

답변

5

생성자 템플릿에 명시 적 템플릿 인수를 제공하는 것은 불가능합니다.

유형은 추론해야한다 : 그들은이 작업을 수행하려면

일반적으로
template<typename T> 
template<typename TypeValue, typename TypeMin, typename TypeMax> 
ScalarClamped<T>::ScalarClamped(TypeValue&& value_, TypeMin&& min_, TypeMax&& max_): 
    // Initialization list: 
    _m_tValue(std::forward<TypeValue>(value_)), 
    _m_tValueMax(std::forward<TypeMax>(max_)), 
    _m_tValueMin(std::forward<TypeMin>(min_)) 
    // Function body: 
    { 
     Algorithm::clamp<TypeValue, TypeMin, TypeMax>(_m_tValue, _m_tValueMin, _m_tValueMax); 
    } 

template<typename T> 
ScalarClamped<T> 
ScalarClamped<T>::operator+(ScalarClamped const& scalar_clamped_) const 
{ 
    return ScalarClamped<T>::ScalarClamped(
     _m_tValue + scalar_clamped_._m_tValue, 
     _m_tValueMin, 
     _m_tValueMax); 
} 
+0

답변 해 주셔서 감사합니다! 이 코드 조각의 기능과 성능이 제 코드 조각과 동등하게 또는 더 나은가? 불필요한 사본이 있습니까? – Helixirr

+0

':: ScalarClamped' ->'ScalarClamped (...)'을 생략 할 수 없습니까? – dyp

+0

아, 그런데 왜? 명시 적 템플릿 인수를 생성자 템플릿에 제공하는 것이 왜 불가능합니까? 이유는 무엇입니까? – Helixirr

관련 문제