C++ - 在模板类中显式调用构造函数模板?

标签 c++ templates constructor typename

我有一个名为 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);
}

如您所见,我正在尝试调用模板构造函数。这是它的实现(正在进行中,也可能包含错误):

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++ - 在模板类中显式调用构造函数模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17133947/

相关文章:

c++ - OpenGL 1.1 的哪个版本的 Glut?

c++ - Mergesort - 尝试分配 vector 时抛出 std::bad_alloc

c++ - 使用另一个模板的模板

c++ - 如何在嵌套列表初始化中从 map<> 中辨别 vector<>?

c++ - 在初始化列表中使用后递增运算符

java - 使代码可供其他子类和子子类使用

c++ - 在 Tensorflow C++ API 中初始化变量

c++ - 在 C++ 中使用 pthreads 的一个非常简单的线程池

c++ - 类模板成员函数没有 "redefinition of default parameter error"?

c++ - 模板函数重载和 SFINAE 实现