gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:59:34 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com