错误:无法从"元组<[...]、std::__1::元组<无符号长长、无符号长长>>"到"常量元组<[...],uint_type>"的可行转换

error: no viable conversion from 'tuple<[...], std::__1::tuple<unsigned long long, unsigned long long>>' to 'const tuple<[...], uint_type>'

本文关键字:lt 元组 gt 无符号 uint type 转换 std 错误 常量      更新时间:2023-10-16

我正在尝试使用 unsinged long long

tuple实现ackerman函数

这是我要创建的台词

A(m, n) = A(m - 1, A(m, n - 1))

所以这是我的代码:

    uint_type calculate(tuple_type const& args) const {
    uint_type retval;
        uint_type retval;
        auto second = make_tuple(m - 1, calculate(make_tuple(m, n - 1)));
        auto first = make_tuple(m - 1, second);
        retval = calculate(first);
        return retval;
       }
   };

这是错误:

错误:没有可行的'tuple&lt; [...]的可行转换 std :: __ 1 :: tuple>'to'const 元组&lt; [...],uint_type>' retval =计算(firstTuple);

^~~~~~~~~~~~

如果您使用大量auto和模板功能(例如make_tuple),有时很难找到类型错误。这是您少使用automake_tuple的写作方式:

uint_type calculate(tuple_type const& args) const {
    const uint_type m = get<0>(args);
    const uint_type n = get<1>(args);
    uint_type retval;
    tuple_type second{m - 1, calculate(tuple_type{m, n - 1})};
    tuple_type first{m - 1, second};
    //                      ^^^^^^ error
    retval = calculate(first);
    return retval;
}

您可以看到如何添加夫妇类型注释将错误消息完全移动到错误的位置。

但是,这不是ackermann函数。这是Ackermann功能:

uint_type calculate(tuple_type args) const {
    const uint_type m = get<0>(args);
    const uint_type n = get<1>(args);
    if (m == 0)
        return n + 1;
    if (n == 0)
        return calculate(tuple_type{m - 1, 1});
    return calculate(tuple_type{m - 1, calculate(tuple_type{m, n - 1})});
}

请注意,可以省略tuple_type

uint_type calculate(tuple_type args) const {
    const uint_type m = get<0>(args);
    const uint_type n = get<1>(args);
    if (m == 0)
        return n + 1;
    if (n == 0)
        return calculate({m - 1, 1});
    return calculate({m - 1, calculate({m, n - 1})});
}