【问题标题】:c++ having trouble storing tuple of pointersC ++遇到存储指针元组
【发布时间】:2016-08-26 19:01:00
【问题描述】:

我有一个对象“S”,它存储一个简单的指针元组,它通过使用可变参数模板变得灵活。有两种方法,store() 和 store2()。第一个(商店)工作正常。第二个无法编译,因为 std::make_tuple 失败并出现错误:

'没有匹配函数调用'make_tuple'

它进一步补充说,对于第一个参数,没有从 'B*' 到 'B*&&' 的已知对话(这个错误在元组库标题的深处)。

代码在这里:

#include <tuple>
#include <utility>

template<typename...Rs>
struct S
{
    void store(std::tuple<Rs*...> rs)
    {
        rs_ = rs;
    }

    void store2(Rs*...rs)
    {
        rs_ = std::make_tuple<Rs*...>(rs...); // This is the guy that breaks
    }

private:
    std::tuple<Rs*...> rs_;
};

struct B
{};

struct A : S<B, B>
{};

int main()
{
    auto *b1 = new B;
    auto *b2 = new B;
    auto *a1 = new A;

    a1->store(std::make_tuple(b1, b2));   // This works
    a1->store2(b1, b2);    // How can I get this to work?
                           // (It causes an error in std::make_tuple of store2 above)
}

【问题讨论】:

  • FWIW,std::make_tuple(rs...); 为我工作。不过,我没有对该错误的解释。
  • 谢谢——这对我也有用。

标签: c++ c++11 variadic-templates


【解决方案1】:

似乎将其更改为std::make_tuple(rs...) 可以正常工作...

【讨论】:

    【解决方案2】:

    我无法准确地解释为什么这是一个错误(我怀疑这与强制衰减有关),但 std::make_tuple 不打算使用明确指定的模板参数调用(在这种情况下,您可以只使用std::tuple,而是在您希望推断它们时使用)。

    以下两种作品中的任何一种:

    rs_ = std::tuple<Rs*...>(rs...);
    rs_ = std::make_tuple(rs...);
    

    【讨论】:

    • 通过在 make_tuple 中显式指定类型,可以抑制转发引用的模板参数类型推导,因此,make_tuple 的这种实例化通过右值引用获取参数(因为指定的类型不是左值引用)。因为后来 OP 尝试传递左值,所以弹出错误,因为它们不能被右值引用绑定。
    【解决方案3】:

    这是一个错误,因为 make_tuple 与 C++11 或更高版本的 make_pair 一样,采用转发引用,并且当您显式指定非引用的模板参数时,这些转发引用将变为右值引用。

    所以make_tuple&lt;Rs*...&gt;tuple&lt;Rs*...&gt; make_tuple(Rs*&amp;&amp;...) - 参数类型都是右值引用,不绑定到左值(rs... 扩展为左值列表)。

    这些make_meow 函数的全部意义在于避免必须写出显式模板参数,所以...不要写它们。

    【讨论】:

      猜你喜欢
      • 2021-09-29
      • 1970-01-01
      • 2010-11-02
      • 1970-01-01
      • 2021-02-13
      • 1970-01-01
      • 1970-01-01
      • 2011-07-28
      • 2021-04-09
      相关资源
      最近更新 更多