You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++类模板推导指南可否仅推导一个参数另一参数由用户指定?

结论

你当前的推导指南实现方式不可行,这是C类模板实参推导(CTAD)的规则限制导致的,clang的报错完全符合C标准要求。

错误原因

C++标准明确规定:推导指南的所有模板参数,要么可以从推导指南的构造函数参数列表中推导得出,要么必须配置了默认模板实参。
你编写的推导指南中,模板参数A既没有出现在构造函数参数D的推导关联上下文中,也没有设置默认值,编译器没有任何途径可以确定A的具体类型,因此会直接抛出「模板参数无法推导」的错误。
另外CTAD本身没有「部分手动指定、部分自动推导」的语法:只要你在实例化类模板时手动指定了任意一个模板参数,就会关闭所有自动推导逻辑,剩余未指定的模板参数如果没有默认值就会直接报错。

替代实现方案

你可以通过实现辅助构造函数的方式达成「只指定一个模板参数,剩余参数自动推导」的需求,示例代码如下:

template<typename A, typename D>
C<A, typename D::Y> make_C(D d) {
    return C<A, typename D::Y>(d);
}

使用时仅需要手动指定第一个参数,第二个参数会自动从入参推导:

// 仅手动指定A为int,D从入参自动推导,最终实例化类型为C<int, D::Y>
auto c = make_C<int>(some_D_type_instance);

内容的提问来源于stack exchange,提问作者user835943

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 20:06:02