2

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+for one オーバーロードの実装を次に示します。

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|

明らかに、私はそれを間違った方法で呼び出そうとしています。コンストラクター テンプレートを適切に呼び出す方法は?

4

1 に答える 1

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);
}
于 2013-06-16T13:49:54.127 に答える