【问题标题】:Template deduction/substitution error with decltype return [closed]带有decltype返回的模板扣除/替换错误[关闭]
【发布时间】:2018-12-19 19:32:15
【问题描述】:

我这里有这段代码 sn-p,它接受一个函数指针元组和一个值元组,然后将值绑定到函数指针并返回一个带有绑定函数的新元组。

当我直接调用 bind_tuple_impl 时,我没有任何错误,但这并不是调用此例程的实际方法。我还需要在绑定后延迟执行,因此不能选择使用给定参数调用函数。

我处理这一切都错了吗?我是否遗漏了一些明显的东西

template <class Fs, class Ts, std::size_t... Is>
auto bind_tuple_impl(std::tuple<Fs> f, std::tuple<Ts> t, std::index_sequence<Is...>)
   -> decltype(std::make_tuple(std::bind(std::get<Is>(f),std::get<Is>(t))...))
{
   return std::make_tuple(std::bind(std::get<Is>(f),std::get<Is>(t))...);
}

template <class... Fs, class... Ts>
auto bind_tuple(std::tuple<Fs...> f, std::tuple<Ts...> t)
   -> decltype(bind_tuple_impl(f, t, std::index_sequence_for<Fs...>))
{
   return bind_tuple_impl(f, t, std::index_sequence_for<Fs...>);
}

int main()
{
    std::tuple<std::function<void(double)>> f;
    std::tuple<double> t;

    auto f_bound = bind_tuple(f,t);
}

错误:

main.cpp:91:68: error: expected primary-expression before ')' token    
    -> decltype(bind_tuple_impl(f, t, std::index_sequence_for<Fs...>))    
                                                                    ^    
main.cpp: In function 'decltype (bind_tuple_impl(f, t, <expression error>)) bind_tuple(std::tuple<_Tps ...>, std::tuple<_Elements ...>)':

main.cpp:94:63: error: expected primary-expression before ')' token    
    return bind_tuple_impl(f, t, std::index_sequence_for<Fs...>);    
                                                               ^    
main.cpp: In function 'int main()':    
main.cpp:102:34: error: no matching function for call to 'bind_tuple(std::tuple<std::function<void(double)> >&, std::tuple<double>&)'    
     auto f_bound = bind_tuple(f,t);    
                                  ^    
main.cpp:89:6: note: candidate: 'template<class ... Fs, class ... Ts> decltype (bind_tuple_impl(f, t, <expression error>)) bind_tuple(std::tuple<_Tps ...>, std::tuple<_Elements ...>)'    
 auto bind_tuple(std::tuple<Fs...> f, std::tuple<Ts...> t)    
      ^~~~~~~~~~    
main.cpp:89:6: note:   template argument deduction/substitution failed:

【问题讨论】:

  • std::index_sequence_for&lt;Fs...&gt;{}
  • std::index_sequence_for&lt;Fs...&gt;是一个类型,需要传递一个对象
  • 是的。我现在真的觉得很傻。感谢您的回复!

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


【解决方案1】:

这里:

return bind_tuple_impl(f, t, std::index_sequence_for<Fs...>);

std::index_sequence_for&lt;Fs...&gt; 只是一个类型。你需要实例化它:

return bind_tuple_impl(f, t, std::index_sequence_for<Fs...>{});

在您的 decltype 中进行相同的更改(或者只是去掉尾随的返回类型,让 auto 完成它的工作!)。

【讨论】:

    猜你喜欢
    • 2013-06-20
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 2015-12-09
    • 2022-01-12
    • 1970-01-01
    相关资源
    最近更新 更多