我正在尝试使用tuple
unsinged long long
这是我正在尝试创建的行
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< [...]没有可行的转换, 的std :: __ 1 ::元组GT;” 'const 元组< [...],uint_type>' retval = calculate(firstTuple);
^ ~~~~~~~~~强调文字
答案 0 :(得分:1)
如果您使用大量auto
和make_tuple
等模板函数,有时很难找到类型错误。以下是您使用auto
和make_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})});
}