【问题标题】:Problems using boost multiprecision library使用 boost 多精度库的问题
【发布时间】:2015-04-08 20:37:16
【问题描述】:

我正在尝试编写一个基本转换程序,该程序适用于超出 C++ 长整数限制的数字。我正在尝试使用 boost 多精度库,但还没有走得很远。

我尝试编译以下内容:

#include <boost/multiprecision/gmp.hpp>
#include <iostream>
#include <string>
#include <stdio.h>

namespace boost{ namespace multiprecision{

class gmp_int;

typedef number<gmp_int >         mpz_int;

}} // namespaces
 using namespace boost::multiprecision;
int main(int argc, const char * argv[]) {
mpz_int seed = 18446744073709551615;

 std::cout << seed;
  return 0;
}

并收到以下错误:

    main.cpp:17:20: error: reference to 'gmp_int' is ambiguous
typedef number<gmp_int >         mpz_int;
               ^


main.cpp:15:11: note: candidate found by name lookup is
  'boost::multiprecision::gmp_int'
class gmp_int;
      ^

/usr/local/boost_1_57_0/boost/multiprecision/gmp.hpp:2157:40: note:      candidate
  found by name lookup is 'boost::multiprecision::gmp_int'
using boost::multiprecision::backends::gmp_int;
                                   ^

main.cpp:17:20: error: reference to 'gmp_int' is ambiguous
typedef number<gmp_int >         mpz_int;
               ^

main.cpp:15:11: note: candidate found by name lookup is
  'boost::multiprecision::gmp_int'
class gmp_int;
      ^

 /usr/local/boost_1_57_0/boost/multiprecision/gmp.hpp:2157:40: note: candidate
  found by name lookup is 'boost::multiprecision::gmp_int'
using boost::multiprecision::backends::gmp_int;
                                   ^

main.cpp:17:38: error: typedef redefinition with different types ('number<class
  boost::multiprecision::gmp_int>' vs 'number<struct
  boost::multiprecision::backends::gmp_int>')
typedef number<gmp_int >         mpz_int;
                                 ^

/usr/local/boost_1_57_0/boost/multiprecision/gmp.hpp:2214:34: note: previous
  definition is here
typedef number<gmp_int >         mpz_int;
                             ^

main.cpp:22:2: error: reference to 'gmp_int' is ambiguous
 gmp_int seed = 18446744073709551615;
 ^

/usr/local/boost_1_57_0/boost/multiprecision/gmp.hpp:2157:40: note: candidate
  found by name lookup is 'boost::multiprecision::gmp_int'
using boost::multiprecision::backends::gmp_int;
                                   ^

main.cpp:15:11: note: candidate found by name lookup is
    'boost::multiprecision::gmp_int'
class gmp_int;
      ^

main.cpp:32:18:错误:使用未声明的标识符“种子” std::cout

我知道我一定犯了一些非常基本的错误,但我没有成功地修复它们。任何帮助将不胜感激。

我有一个使用#include &lt;boost/lambda/lambda.hpp&gt; 的简单程序,所以我相当肯定boost 安装正确。

【问题讨论】:

  • 另外,使用18446744073709551615ull或从字符串mpz_int seed("18446744073709551615");初始化

标签: c++ boost gmp multiprecision


【解决方案1】:

您似乎从文档中复制了错误的位:http://www.boost.org/doc/libs/1_57_0/libs/multiprecision/doc/html/boost_multiprecision/tut/ints/gmp_int.html

显示的是参考摘要,而不是使用概要。显示的类型已经存在。

少即是多:

Live On Coliru

#include <boost/multiprecision/mpfr.hpp>
#include <iostream>

int main() {
    boost::multiprecision::mpz_int seed = 18446744073709551615ull;
    std::cout << seed;
}

【讨论】:

  • 这很有帮助 - 但是,我仍然收到以下错误:架构 x86_64 的未定义符号:“___gmp_get_memory_functions”,引用自:boost::multiprecision::backends::gmp_int::str( long, unsigned int) const in main-8ba45a.o "___gmpz_clear",引用自:boost::multiprecision::backends::gmp_int::~gmp_int() in main-8ba45a.o "___gmpz_get_str",引用自:boost: :multiprecision::backends::gmp_int::str(long, unsigned int) const in main-8ba45a.o
  • "___gmpz_init",引用自:boost::multiprecision::backends::gmp_int::operator=(unsigned long) in main-8ba45a.o boost::multiprecision::backends::gmp_int: :gmp_int() in main-8ba45a.o "___gmpz_set_ui",引用自:boost::multiprecision::backends::gmp_int::operator=(unsigned long) in main-8ba45a.o ld:找不到符号架构 x86_64 clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
  • 我如何发送垃圾邮件?我只是想把错误信息放在这里,因为我认为它们是隔离问题所必需的
  • 我不可能使示例更具交互性。点击 Live On Coliru 链接,亲自查看。 Here's a clang variant。希望对您有所帮助...
  • @JonathanBasile 我真的不知道。可能是您没有链接 -lgmp(以正确的顺序!!!)或者您的 gmp 确实不是 64 位的。 (Boost 只是这里的标题,所以没关系)。如果你不解决,发布一个关于链接器错误的新问题并标记它boostc++osxclang++
【解决方案2】:

您正在声明一个新类型class gmp_int;。我无法理解您为什么要这样做。

但是,这意味着下一行

typedef number<gmp_int >         mpz_int;

现在无法确定您是指新类型 ::gmp_int 还是 Boosts 版本 ::boost::multiprecision::gmp_int

您的 C++ 编译器试图告诉您,它无法确定哪个 gmp_int 的含义是“对 'gmp_int' 的引用不明确”。

【讨论】:

  • OI 明白了 - 我对文档有点困惑 - 如果我删除类定义,我仍然会收到以下错误:main.cpp:17:17: 警告:整数常量大于最大值有符号整数类型 gmp_int 种子 = 18446744073709551615; ^ main.cpp:17:10: 错误:没有从 'unsigned long long' 到 'boost::multiprecision::backends::gmp_int' 的可行转换 gmp_int seed = 18446744073709551615;
  • @JonathanBasile 我已经在我的评论中解决了这个问题。另外,请参阅我的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 2013-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多