【问题标题】:how to solve template parameter deduce problem? [duplicate]如何解决模板参数推导问题? [复制]
【发布时间】:2021-10-05 20:32:57
【问题描述】:

编译器无法推导出_t2,报此错误:

无法推断“_t2”的模板参数

有任何建议,而不对main()进行任何更改?

#include <tuple>

template <
    typename                        _t1,
    template <typename> typename    _t2>
void test(
    _t1                     p1,
    std::tuple<int, _t2>    p2)
{
}

int main(int argc, char *argv[])
{
    test(
        1,
        {
            2,
            'a'
        });

    return 0;
}

【问题讨论】:

  • template &lt;typename&gt; typename _t2 表示_t2 是具有typename 模板参数的类型。它应该只是typename _t2
  • @TARN4T1ON,所以我得到“无法推断'_t2'的模板参数”错误...
  • 哦,是的。不同的地方。您必须在传递给test 的参数中显式调用std::tuple&lt;int, char&gt; 的构造函数。所以要么std::tuple&lt;int, char&gt;(2, 'a')要么std::tuple&lt;int, char&gt; { 2, 'a' },而不是初始化列表。
  • @VeNToR Drew 建议的目标正是您遇到的问题(一旦您将模板模板参数更改为 TARN4TION 提到的模板参数)。为什么你不认为这是同一个问题?
  • 不,它不能(好吧,它可以只使用tuple 构造函数,但这是同一回事)。无论如何,您的问题仍然与目标相同,对吗?花点时间阅读那篇文章,看看为什么如果你想推断类型就不能使用{}

标签: c++ c++20


【解决方案1】:

问题出在这里:

test(
    1,
    {
        2,
        'a'
    });

编译器不能推导出花括号。您应该将该行更改为:

test(
    1,
    std::make_tuple(
        2,
        'a'
    ));

你的功能是:

template <
    typename                        _t1,
    typename    _t2>
void test(
    _t1                     p1,
    std::tuple<int, _t2>    p2)
{
}

【讨论】:

  • 有没有没有 std::make_tuple 的解决方案?
  • 直接调用std::tuple构造函数。实际上,这也正是 std::make_tuple 所做的。
  • @VeNtoR 我不这么认为,请参阅en.cppreference.com/w/cpp/utility/tuple
  • @TARN4T1ON 是的,你是对的,但这只是更长更糟糕:std::make_tuple(2,'a') 与 std::tuple(2, 'a ')
  • @TyceBrown,我已经记住了 en.cppreference.com/w/cpp/utility/tuple :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多