我在一个复杂的项目中有一个对象。因此,我可能无法提供所有这些类的非常详细的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
元素的一般想法。
也许我面临的问题不适合在这里进行公开讨论。很抱歉抽出宝贵的时间。我现在无法删除此问题,也许你们当中的一个可以帮助您立即结束此问题。
谢谢您的时间。
答案 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 );