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

C++ C++;成员函数的条件模板类定义,c++,c++17,C++,C++17,给定头文件中的以下类转发声明: template <typename T, std::enable_if_t<std::is_integral_v<T>, int> = 0> class context { public: context(); // .... private: // .... T data; } 模板 类上下文 { 公众: 上下文(); // .... 私人: // .... T数据; } 如何在cpp文件中定义构造函数(

给定头文件中的以下类转发声明:

template <typename T, std::enable_if_t<std::is_integral_v<T>, int> = 0>
class context
{
public:
    context();
// ....
private:
// ....
    T data;
}
模板
类上下文
{
公众:
上下文();
// ....
私人:
// ....
T数据;
}
如何在cpp文件中定义构造函数(或任何其他成员函数)?尝试了我能想到的一切,但没有匹配的

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


请注意,如果这是重复的,我确实试图找到类似的问题,但找不到合适的术语来找到匹配项。

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

template<typename T, std::enable_if_t<std::is_integral_v<T>, int> N>
context<T, N>::context() {
}
模板
context::context(){
}
参数类型在类模板定义中为
std::enable_if_t
。这正是类外定义中参数的类型

顺便说一句,我看不出支票目前的状况有什么好处。与函数模板不同,函数模板可能会影响重载解析,而类模板则不会从该机制中获得太多好处。在我看来,最好只是在类模板声明中添加一个静态断言

template<typename T>
class context {
    static_assert(std::is_integral_v<T>, "Must be initialized with an integral type");
    // ...
};
模板
类上下文{
静态断言(std::is_integral_v,“必须用整数类型初始化”);
// ...
};

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

模板类成员不在cpp文件中。它们必须与类的其余部分一起放在标题中,因为模板不是“真正的代码”。它们是代码的模板,编译器需要在需要时提供全部内容来创建真正的代码。我认为如果您需要在标题中声明类成员,然后在标题中稍后定义它们,那么问题仍然存在。谢谢,这是可行的,出于某种原因,我从未想过要命名第二个模板参数,也感谢您提供的附加信息,我会考虑的