无法使用std :: get到达元组元素

时间:2018-07-25 15:17:02

标签: c++ stl stdtuple

原始帖子:

我在一个复杂的项目中有一个对象。因此,我可能无法提供所有这些类的非常详细的API,但是我试图在不需要细节的情况下抽象出我的问题。

首先,下面的代码可以正常工作:

auto ha = std::get< 1 >( d.data ).data;

然后我尝试在下面添加代码:

auto ha = std::get< 1 >( d.data ).data;
int ma = ha;

编译器说

cannot convert ‘std::tuple<>’ to ‘int’ in initialization int ma = ha;
cannot convert ‘std::tuple<PointStreamColor<float> >’ to ‘int’ in initialization

这应该表示ha是std :: tuple变量。然后我有下面的代码:

auto ha = std::get< 1 >( d.data ).data;
auto ma = std::get< 0 >( ha );

对于上面的代码,编译器说

no matching function for call to ‘get(std::tuple<>&)’ int ma = std::get< 0 >( ha );

我不明白为什么我不能使用std :: get到达std :: tuple的第一个元素?谁能给我个主意吗?

更新

谢谢大家指出我应该提供更多信息。在发布之前,我对此完全理解。但是这里的类的实现是 基于模板,如此庞大和层次化,以至于我无法全部提供。

因此,我试图询问任何可能导致无法通过std::tuple到达std::get元素的一般想法。

也许我面临的问题不适合在这里进行公开讨论。很抱歉抽出宝贵的时间。我现在无法删除此问题,也许你们当中的一个可以帮助您立即结束此问题。

谢谢您的时间。

1 个答案:

答案 0 :(得分:4)

您不能从没有元素的元组中获取第零个元素。

与在0处索引空数组的概念相同。

编辑:为澄清起见,我怀疑您的代码被调用了两次。线

auto ha = std::get< 1 >( d.data ).data;
int ma = ha;

给出两个错误消息,因为在两种情况下,ha是一个元组,不能转换为整数:

cannot convert ‘std::tuple<>’ to ‘int’ in initialization int ma = ha;
cannot convert ‘std::tuple<PointStreamColor<float> >’ to ‘int’ in initialization

在第一种情况下,这表明ha是一个空元组。在第二种情况下,ha有一个元素。

备用代码

auto ha = std::get< 1 >( d.data ).data;
auto ma = std::get< 0 >( ha );

仅会产生一条错误消息,因为当std::get< 0 >( ha )是具有一个元素的ha类型时,std::tuple<PointStreamColor<float> >在第二种情况下是完全有效的。当ha类型为std::tuple<>且为空时,第一种情况会产生此错误消息:

no matching function for call to ‘get(std::tuple<>&)’ int ma = std::get< 0 >( ha );