如何在类上使用C++20 concepts?为何约束类模板会报冲突错误?
问题解答:C++20 concepts是否仅支持函数模板使用?
首先给出明确结论:不是。你遇到的编译错误是类模板和函数模板的约束重载规则不同导致的,和concepts本身的适用范围无关。
为什么函数模板的写法合法
C++20支持函数模板基于约束的重载:同一个作用域下,允许声明多个同名、模板参数列表结构完全一致,仅模板约束不同的函数模板。实例化时编译器会自动选择匹配度最高的重载版本,你写的两个f()函数模板完全符合这个规则,因此可以正常编译。
为什么类模板的原始写法报错
当前C++标准不支持主类模板的基于约束的重载:同一个作用域下不允许声明多个同名、模板参数数量一致,仅约束不同的主类模板,这就是你收到declaration of template parameter 'class T' with different constraints报错的原因。
如果要实现根据参数类型的约束匹配不同的类模板实现,要使用「主模板声明+带约束的偏特化」的写法,示例如下:
#include <concepts> // 先声明无约束的主模板 template<typename T> struct Point; // 浮点型参数的偏特化 template<std::floating_point T> struct Point<T> {}; // 整型参数的偏特化 template<std::integral T> struct Point<T> {};
上述写法是合法的,实例化Point<int>会匹配整型偏特化,Point<double>会匹配浮点型偏特化。
concepts的其他适用场景
除了函数模板,concepts还可以用于以下场景的约束:
- 类模板、类模板的成员函数
- 变量模板
- 别名模板
- 模板化lambda表达式
内容的提问来源于stack exchange,提问作者Steffen Roeber
相关产品推荐
相关产品推荐

