成员函数的C ++条件模板类定义

接受

在头文件中给出以下类正向声明:

template <typename T, std::enable_if_t<std::is_integral_v<T>, int> = 0>
class context
{
public:
    context();
// ....
private:
// ....
    T data;
}

如何在cpp文件中定义构造函数(或任何其他成员函数)?尝试了所有我能想到的,但是没有匹配的...。

另一个问题引起了我的注意,为什么模板只能在头文件中实现?并且我已经在项目中的多个地方成功使用了接受的答案中建议的方法,但是我找不到以任何方式表示第二个模板参数的方法...该问题没有提供足够的信息来做到这一点。问题是这里的第二个模板参数使该参数与那里建议的方式不兼容,或者我只是找不到合适的语法来表示它,如果我的类只有第一个参数,它将回答它...

PS对不起,如果这是重复的话,我真的试图找到一个类似的问题,只是找不到合适的术语来找到匹配项。

讲故事的人-Unslander Monica

要提供类外定义,模板参数列表必须匹配。

template<typename T, std::enable_if_t<std::is_integral_v<T>, int> N>
context<T, N>::context() {
}

参数类型std::enable_if_t<std::is_integral_v<T>, int>在类模板定义中。这正是类定义之外的参数类型。

顺便说一句,我认为支票目前没有好处。与函数模板不同,函数模板可能会影响重载解析,而类模板则根本无法从机制中受益。IMO最好在类模板声明中简单地添加一个静态断言

template<typename T>
class context {
    static_assert(std::is_integral_v<T>, "Must be initialized with an integral type");
    // ...
};

然后,类外成员声明变得更加直接。而且有关错误模板参数的错误消息更易读。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章