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

标签 c++ c++17

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

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?并且我已经在我的项目的多个地方成功地使用了接受的答案中建议的方法,但是我找不到以任何方式表示第二个模板参数的方法......该问题没有提供足够的信息来做到这一点。问题是这里的第二个模板参数使得它要么与那里建议的方式不兼容,要么我找不到合适的语法来表示它,如果我的类只有第一个参数它会回答它......

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

最佳答案

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

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

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

关于成员函数的C++条件模板类定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59066006/

相关文章:

c++ - 函数 stoi 未声明

c++ - prvalues的cv-qualifications (revisited)

c++ - 无法在用户定义的类型上使用 std::apply

C++ 查找一个点集位于两个点集之间的位置

c++ - 为什么 std::void_t 在这种情况下不起作用?

c++ - 在模板模板参数的情况下,由 decltype(auto) 推导的引用非类型模板参数是否可转发

C++ 异步编程,如何不等待 future ?

c++ - 无法在函数模板中使用 lambda 函数

c++ - 直接从 bind1st 和 bind2nd 调用返回仿函数

c++ - 哈希表中的段错误