c++ - 为什么我得到() 函数不能接收元组的子类?
问题描述
我在线复制了一个元组实现,它适用于大多数情况:
template<class... Ts>
class tuple {};
template<class T, class... Ts>
class tuple<T, Ts...> : public tuple<Ts...> {
public:
tuple(T t, Ts... ts) : tuple<Ts...>(ts...), tail(t) {}
T tail;
};
template<size_t, class>
struct elem_type_holder;
template<class T, class... Ts>
struct elem_type_holder<0, tuple<T, Ts...>> {
typedef T type;
};
template<size_t k, class T, class... Ts>
struct elem_type_holder<k, tuple<T, Ts...>> {
typedef typename elem_type_holder<k - 1, tuple<Ts...>>::type type;
};
template<size_t k, class... Ts>
typename std::enable_if<
k == 0, typename elem_type_holder<0, tuple<Ts...>>::type &>::type
get(tuple<Ts...> &t) {
return t.tail;
}
template<size_t k, class T, class... Ts>
typename std::enable_if<
k != 0, typename elem_type_holder<k, tuple<T, Ts...>>::type &>::type
get(tuple<T, Ts...> &t) {
tuple<Ts...> &base = t;
return get<k - 1>(base);
}
例如,我写了这样的代码:
tuple<int, int, int> mytuple(1, 2, 3);
std::cout << get<1>(mytuple) << std::endl;
“2”将打印。
但是我发现如果我创建一个继承我的自定义元组的子类:
class Foo : public tuple<int, int, int> {
public:
Foo() : tuple<int, int, int>(1, 2, 3) {}
};
Foo
并为in创建一个对象main()
:
Foo foo;
td::cout << get<1>(foo) << std::endl;
该get()
功能将不起作用,错误是:
no matching function for call to ‘get<1>(Foo&)’
然后我测试std::tuple
andstd::get()
的子类std::tuple
与std::get()
.
目前我必须将它静态转换为元组类而不是传递它,这很烦人。
那么我错过了什么?我怎样才能通过我tuple
喜欢的 stl 的子类?
解决方案
g++
告诉我们:
<source>:30:6: note: template argument deduction/substitution failed: <source>:39:15: note: 'tuple<T, Ts ...>' is an ambiguous base class of 'Foo' 39 | get<1>(foo); | ^
这是由以下的递归继承性质引起的:
template <class T, class... Ts>
struct tuple<T, Ts...> : tuple<Ts...> { };
由于编译器不知道要推断什么基类。它可以是tuple<int>
、tuple<int, int>
或中的任何一个tuple<int, int, int>
。
实际上,将定义更改为...
template <class T, class... Ts>
struct tuple<T, Ts...> { };
...将使扣除工作。
一种可能的解决方法是将您的元组重新定义为:
template <class T, class... Ts>
struct tuple<T, Ts...>
{
tuple<Ts...> parent;
};
推荐阅读
- mysql - 试图获取一个表中的所有记录,这些记录在另一个表中有数据并总结它们
- python - Python - YouTube API v3 - 如何仅获取热门搜索结果的视频 ID?
- pandas - Groupby操作后如何制作条形图(x轴上有日期)
- angular - 具有状态和目标 _blank 的 Angular Routerlink
- r - Shiny 布局,Shiny 中是否可以有left andride sidebarLayout?
- java - Java - 围绕文件内容打印框
- python - 在 Snakemake 管道中添加自动 QC 以在管道步骤中间过滤掉质量差的样本
- selenium - 如何将 Edge 和 Safari 连接到在 AWS Linux 实例上运行的 Selenium Grid?
- asp.net-core - ASP 网络核心 3.1。动态设置身份选项
- pandas - 使用 jupyter Notebook 进行 Facebook Messenger 分析