如何查看C++类模板A、A3的隐式推导指引
问题描述
在调试类模板参数推导相关代码时遇到如下编译报错:
<source>:44:8: error: template parameters not deducible in partial specialization: 44 | struct A3<int> : A<N> { | ^~~~~~~ <source>:44:8: note: 'N' Compiler returned: 1
核心诉求:如何查看类模板A3和A的deduction guides(推导指引)?
编辑说明:已移除无效代码片段,此前评论区讨论严重偏离主题。隐式deduction guides生成规则复杂度较高,聚合类对应的规则尤其容易出错。对于C++新手而言,如果能查看编译器自动生成的所有推导指引,将为调整隐式推导指引提供极大便利,因此即便此前贴出的代码片段无效,该问题仍有较高实用价值。
可行查看方法
- 编译器AST dump法
这是最直接的能拿到完整隐式推导指引的方式:- 用GCC编译时添加
-fdump-class-rewrite参数,编译后生成的dump文件中会记录所有自动生成的类相关语法节点,搜索目标类名即可定位到对应的隐式推导指引。 - 用Clang编译时添加
-Xclang -ast-dump -ast-dump-filter=<目标类名>参数,编译器会直接在终端输出目标类相关的所有AST节点,其中就包含隐式生成的推导指引条目,不会输出其他无关类的冗余信息。
- 用GCC编译时添加
- 编译报错反向查候选法
如果不需要拿到完整的指引文本,只是要确认可用的推导指引签名,可以故意写触发类模板参数推导失败的代码:比如不指定模板参数直接声明目标类的变量,编译器报错时会列出所有尝试匹配的推导指引候选,其中就包括编译器隐式生成的版本,可以直接看到每个指引的参数、返回值签名。 - 规则手动推算法
隐式推导指引的生成逻辑是固定的:对于类模板的每个构造函数(包括聚合类隐式生成的聚合构造签名),编译器都会生成一个对应签名的推导指引,返回值为模板参数匹配后的类类型。如果是没有用户声明构造函数的聚合类,隐式推导指引的参数顺序、类型会和聚合成员的初始化顺序、类型一一对应,可以直接根据类定义推算出所有隐式推导指引的形式。
内容的提问来源于stack exchange,提问作者user19087
相关产品推荐
相关产品推荐

