C++带requires约束的类模板成员函数头文件内类外定义方法
带requires约束的类模板成员函数类外实现方法
问题场景
现有命名空间prj下的类模板Speaker:
- 类模板本身带约束:要求模板参数
T满足std::is_integral<T> - 类内声明了模板成员函数
speak,该成员函数自身也带约束:要求自身的模板参数U满足std::is_integral<U>
需要在同一个头文件内、类定义的外部补全该成员函数的实现,初始待补全代码框架如下:
// speaker.h #include <concepts> namespace prj { template <typename T> requires std::is_integral<T> struct Speaker { template <typename U> requires std::is_integral<U> const void speak(const Speaker<U> &speaker); }; // what do I put here? const void Speaker<T>::speak(const Speaker<U> &speaker) { // code } }
补全规则
类外定义嵌套的带约束模板成员时,需要严格按照「类模板参数列表 → 类模板requires约束 → 成员函数模板参数列表 → 成员函数requires约束」的顺序书写声明,不能颠倒顺序。
补全后完整代码
在注释标注的位置补充两层模板声明和对应的约束即可,完整实现如下:
// speaker.h #include <concepts> namespace prj { template <typename T> requires std::is_integral<T> struct Speaker { template <typename U> requires std::is_integral<U> const void speak(const Speaker<U> &speaker); }; // 补充的定义声明部分开始 template <typename T> requires std::is_integral<T> template <typename U> requires std::is_integral<U> // 补充的定义声明部分结束 const void Speaker<T>::speak(const Speaker<U> &speaker) { // 函数实现逻辑 } }
注意事项
- 约束必须和对应模板的参数列表紧邻:类的
requires约束跟在类模板template <typename T>之后,成员函数的requires约束跟在成员函数自己的template <typename U>之后,顺序错配会导致编译报错。 - 该写法完全符合C++20标准,实现放在头文件中即可被正常实例化使用,不需要额外的显式实例化声明(有特殊分离编译需求的场景除外)。
内容的提问来源于stack exchange,提问作者boat d
相关产品推荐
相关产品推荐

