在模板类中显式调用构造函数模板
C++ - Invoking a constructor template explicitly inside a template class?
我有一个叫做ScalarClamped的类模板。这个类的实例有一个用户确定的值范围,每当赋给它的值超出它的范围时,该值将被夹住到用户确定的值范围内,因此得名"ScalarClamped":
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+
时,我遇到了一个问题。下面是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);
}
如您所见,我正在尝试调用模板构造函数。这是它的实现(工作正在进行中,也可能包含bug):
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|
显然我试图以错误的方式调用它。如何恰当地调用构造函数模板?
不可能为构造函数模板提供显式的模板参数。
类型必须被推断:
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);
}
相关文章:
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- C++如果两个模板函数都与参数列表匹配,将调用哪个模板
- 如何在类模板的成员函数中正确调用函数对象?正在生成 Visual Studio 编译器错误 C2440
- 为什么没有调用此模板类的复制构造函数?
- 调用类模板中隐式删除的复制构造函数
- 从模板化函数调用非模板化函数
- 从类似构造函数的调用返回模板化智能指针
- 从模板化类虚拟函数中调用的模板函数不正确
- 需要"模板<>"语法 --> 通过函数调用类模板
- 模板 使用数据数组调用函数时扩展参数包
- C++,当函子不是一个选项时,我如何编写带有自定义函数调用的模板化 RAII 包装器?
- 调用类模板的成员函数模板
- 如何从前面定义的另一个函数调用函数模板
- 未为派生类型调用函数模板专用化
- Lambda函数无法调用函数模板参数的静态函数
- 不能用函数参数调用函数模板
- 使用函数指针调用函数模板
- 调用函数模板时出错"No matching function"
- 为派生的可变参数类模板调用函数模板重载
- 使用C调用约定调用函数模板专门化