繁体   English   中英

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

[英]C++ conditional template class definition of member function

给定头文件中的以下类前向声明​​:

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

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

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

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

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

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");
    // ...
};

然后类外成员声明变得更加直接。 关于错误模板参数的错误消息更具可读性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM