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
相关产品推荐
相关产品推荐

