编译错误 - 模板,enable_if

compile error - templates, enable_if

本文关键字:enable if 模板 错误 编译      更新时间:2023-10-16

您能告诉我为什么此代码不编译吗?

template <typename T, T minAge, T maxAge, bool isarmed,
typename = std::enable_if_t<std::is_arithmetic<T>::value>>
class Citizen {
public:
    Citizen(T health, T age);
    Citizen(T health, T age, T attackPower);
    T getHealth() const { return _health; };
    T getAge() const { return _age; };
    T getAttackPower();
    void takeDamage(T damage);
private:
    T _health;
    T _age;
    T _attackPower;
};
template <typename T, T minAge, T maxAge, bool isarmed>
Citizen<T, minAge, maxAge, isarmed>::Citizen(T health, T age):
        _health (health),
        _age (age)
{
    static_assert(minAge <= maxAge, "Wrong age");
    assert(minAge <= this->_age && this->_age <= maxAge);
}

我缺少什么?

error: invalid use of incomplete type ‘class Citizen<T, minAge, maxAge, isarmed>’

您将Citizen声明为类模板,占5模板参数:

template <typename T, T, T, bool, typename >
class Citizen { ... };

然后尝试仅使用4个模板参数来定义构造函数:

template <typename T, T minAge, T maxAge, bool isarmed>
Citizen<T, minAge, maxAge, isarmed>::Citizen(T health, T age) 

没有这样的以前声明为4-Template-Parameter Citizen,因此错误。您仍然需要最后一个模板参数。


请注意,Sfinae在这里没有道理,除非您有其他一些非算术Citizen类模板(本身没有多大意义)。只需将static_assert用于T是算术类型即可。