GMP C++库:mpz_class转unsigned long时get_ui函数编译报错
问题原因及解决方案
问题核心在于auto b = a % 10;这一行的类型推导:
- GMP的C++接口中,
%这类算术运算符返回的并非mpz_class实例,而是__gmp_expr模板类型的临时表达式对象——这个表达式对象并没有get_ui()成员函数,只有真正的mpz_class对象才提供该方法。 - 用
auto推导时,b被识别为这个表达式类型,而非mpz_class,因此调用get_ui()会触发编译错误。
两种修正方式
方式1:显式声明b为mpz_class类型
将auto b = a % 10;改为:
mpz_class b = a % 10;
此操作会把表达式结果转换为真正的mpz_class对象,后续即可正常调用get_ui()。
方式2:直接调用C风格GMP函数提取数值
如果不想转换类型,可直接调用GMP的C接口函数提取无符号整数:
auto c = mpz_get_ui(b.get_mpz_t());
通过b.get_mpz_t()获取表达式底层的mpz_t结构体指针,再传给mpz_get_ui完成数值提取。
修正后完整代码示例
#include <iostream> #include <gmpxx.h> using std::cout; using std::endl; int main() { mpz_class a(1); for (auto n = 0U; n < 100; ++n) a *= 10; cout << a << endl; mpz_class b = a % 10; cout << b << endl; auto c = b.get_ui(); cout << c << endl; }
内容的提问来源于stack exchange,提问作者HEKTO
相关产品推荐
相关产品推荐

