在头文件中给出以下类正向声明:
template <typename T, std::enable_if_t<std::is_integral_v<T>, int> = 0>
class context
{
public:
context();
// ....
private:
// ....
T data;
}
如何在cpp文件中定义构造函数(或任何其他成员函数)?尝试了所有我能想到的东西,但是没有匹配的东西。
另一个问题引起了我的注意Why can templates only be implemented in the header file?,我已经在项目的多个地方成功使用了公认的答案中建议的方法,但是在任何方法中我都找不到一种表示第二个模板参数的方法方式...该问题没有提供足够的信息来执行此操作。问题是这里的第二个模板参数使该参数与那里建议的方式不兼容,或者我只是找不到合适的语法来表示它,如果我的类只有第一个参数,它将回答它...
P.S。抱歉,如果重复的话,我真的试图找到一个类似的问题,只是找不到合适的术语来找到匹配项。
答案 0 :(得分:5)
要提供类外定义,模板参数列表必须匹配。
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");
// ...
};
然后,类外成员声明变得更加直接。而且有关错误模板参数的错误消息更容易阅读。