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

C++基于策略模板设计时如何向std::make_unique传递模板实参

解决方法

1. 修正Foo类的_bar成员类型

Bar是带模板参数的模板类,不能直接作为类型使用,必须绑定模板参数后才能实例化。将Foo.hpp中的成员声明修改为:

std::unique_ptr<Bar<T, V>> _bar;

这里直接复用Foo的模板参数T、V作为Bar的模板参数即可。

2. 修正Foo构造函数的初始化列表

std::make_unique的尖括号内需要传入完整的实例化类型,修改初始化代码为:

_bar{ std::make_unique<Bar<T, V>>() }

额外注意事项(代码中隐藏的链接错误问题)

C++模板类的成员函数实现不能放在独立的.cpp文件中,否则编译器在编译调用方代码时无法找到模板实现,会报链接错误。你需要把Bar和Foo的构造函数实现挪到对应的.hpp头文件中;如果你确定只会用到有限的几个策略组合,也可以在bar.cpp和foo.cpp的末尾显式实例化所有用到的特化版本,示例如下:

// bar.cpp末尾添加,仅示例你用到的特化版本
template class Bar<policy1_default, policy2_default>;
template class Bar<Policy2, Policy3>;

对最初两种尝试写法的说明

  • 第一种写法auto bar = std::make_unique<Bar<Policy2, Policy3>>();本身语法正确,之前运行失败大概率是模板实现放在.cpp文件导致的链接错误,修正实现位置后可以正常使用
  • 第二种写法auto bar = std::make_unique<Bar>(Policy2, Policy3);是错误的:Policy2、Policy3是类型,不是函数参数,必须放在尖括号中作为模板参数传递,不能放在圆括号中作为构造函数参数传递。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 23:57:01