错误:'tuple&lt; [...],std :: __ 1 :: tuple <unsigned long =“”long,=“”unsigned =“”long =“”long =“”>&gt;'没有可行的转换'const tuple&lt; [...],uint_type&gt;'

时间:2017-03-07 03:18:00

标签: c++ c++11

我正在尝试使用tuple unsinged long long

来实现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 ::元组GT;” 'const   元组&lt; [...],uint_type&gt;'               retval = calculate(firstTuple);

     

^ ~~~~~~~~~强调文字

1 个答案:

答案 0 :(得分:1)

如果您使用大量automake_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;
}

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

但是,这不是阿克曼功能。这是阿克曼函数:

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})});
}