我有一个对象'S',它存储一个简单的指针元组,通过使用可变参数模板使其变得灵活。有两种方法,store()和store2()。第一个(商店)工作正常。第二个将无法编译,因为std :: make_tuple失败并显示错误:
'调用'make_tuple'没有匹配函数
它进一步补充说,从“B *”到“B *&&”之间没有已知的对话。对于第一个参数(此错误在元组库头中很深)。
代码在这里:
photo_set
答案 0 :(得分:6)
这是一个错误,因为make_tuple
与C ++ 11或更高版本make_pair
一样,采用转发引用,当您明确指定非引用的模板参数时,这些转发引用变为rvalue引用。
所以make_tuple<Rs*...>
是tuple<Rs*...> make_tuple(Rs*&&...)
- 参数类型都是右值引用,它们不绑定到左值(并且rs...
扩展为左值列表)。
这些make_meow
函数的重点是避免必须写出显式模板参数,所以......不要写它们。
答案 1 :(得分:3)
我无法解释确切为什么会出现错误(我怀疑它与强制性衰退有关),但std::make_tuple
是不打算使用显式指定的模板参数进行调用(在这种情况下,您可以只使用std::tuple
,而不是在需要推导它时)。
以下两项工作中的任何一项:
rs_ = std::tuple<Rs*...>(rs...);
rs_ = std::make_tuple(rs...);
答案 2 :(得分:0)
似乎通过将其更改为std::make_tuple(rs...)
它可以正常工作......