c++ - 公开类型的模板模板参数
问题描述
我有一个依赖于模板模板参数的类型:
template<typename X_, template<typename, typename> class Y_>
struct A { /*...*/ };
我用工厂函数构造:
template<typename X_, template<typename, typename> class Y_>
A<X_, Y_> make() {
return A<X_, Y_> { /*...*/ };
};
现在,我想添加一个工厂函数,它接受一个A
引用并分配给它,而不必重新声明它的模板参数:
template<typename A_>
void make(A_& a) {
a = make<typename A_::X, typename A_::Y>();
}
我添加了两个模板别名A
来实现这一点:
template<typename X_, template<typename, typename> class Y_>
struct A {
using X = X_;
template <typename... T>
using Y = Y_<T...>;
/* ... */
};
然后我尝试编译:
A<int, std::vector> v;
make(v);
产生,见 Godbolt:
<source>: In instantiation of 'void make(A_&) [with A_ = A<int, std::vector>]':
<source>:24:11: required from here
<source>:18:9: error: 'typename A<int, std::vector>::Y' names 'template<class ... T> using Y = class std::vector<T ...>', which is not a type
18 | a = make<typename A_::X, typename A_::Y>();
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我不明白为什么 GCC 9.2 不同意我Y
的那种类型。我应该如何正确地将我的意图传达给编译器?
解决方案
不是typename
,但template
您应该使用:
template<typename A_>
void make(A_& a) {
a = make<typename A_::X, A_::template Y>();
}
此外
template<typename X_, template<typename, typename> class Y_>
struct A {
using X = X_;
template <typename... T>
using Y = Y_<T...>;
/* ... */
};
Y
并且Y_
不等价,你需要
template <typename T1, typename T2>
using Y = Y_<T1, T2>;
而且我认为只有从 C++17 开始,它们才会等效。
推荐阅读
- asp.net-core - 如何使用 .NET 中的文件初始化 FormCollection?
- linux - 无法打开 ssl 443 端口服务器
- python - 当用户在 Python 中输入 ''quit'' 时,中断循环并退出程序
- webpack - 如何将通过 npm 安装的 videojs 与 webpack 一起使用?
- python - 如何在 Python 中从文本文件中获取第二行数据
- r - 如何对 R 中的不同列应用 t 检验?
- mongodb - 使用 MongoDB 聚合将集合合并到固定大小
- python - 如何将导入的模块或函数表示为字符串?
- spring-boot - Hibernate 没有在 MySQL 中创建自动表
- angular - 在primeng表的td字段中使用两个Ngfor