【问题标题】:'default_random_engine' is not a member of std'default_random_engine' 不是 std 的成员
【发布时间】:2015-11-02 16:03:34
【问题描述】:

我发现了很多关于这个主题的问题,但所有问题似乎都与不使用 C++ 11 编译有关。我的代码是

#include <random>
int main(int argc, char *argv[]){
    std::default_random_engine generator;
    return 0;   
}

即使我编译了

gcc -std=c++0x testmain.cpp

给出 default_random_engine 不是 std 成员的错误。程序是在远程机器上编译的,我自己不维护,但是

gcc -v

生成 4.4.7 版本。

有什么想法吗?

【问题讨论】:

  • GCC 4.4 版本非常旧,不支持所有 C++11 标准。值得注意的是缺少随机数功能。
  • 你能在远程机器上安装任何东西吗?还是安装了boost
  • 使用 Boost 或 TR1 随机库。对于后者,#include &lt;tr1/random&gt;。我不认为它有default_random_engine,所以你必须使用别的东西,也许是std::tr1::mt19937
  • @Praetorian 对不起,我在看到您的评论之前发布了我的答案。

标签: c++ c++11 gcc


【解决方案1】:

正如 DevSolar 所述,您的 gcc 版本太旧,无法支持此 C++11 功能。

它是在gcc-4.5中添加的:

改进了对即将推出的 ISO C++ 标准的实验性支持, C++0x,包括:

支持&lt;future&gt;&lt;functional&gt;&lt;random&gt;

参考:https://gcc.gnu.org/gcc-4.5/changes.html

libstdc++ API 参考也反映了这一点:https://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-api-4.5/a01118.html

您可以在哪里找到以下内容:

 typedef minstd_rand0 default_random_engine

你的代码在gcc-5.1.0gcc-4.9.2clang-3.7.0中对我来说很好,

您还应该使用command: g++ 而不是 gcc,这样 gcc 默认会链接到正确的 c++ 库。

【讨论】:

  • hmmm .. 为什么有人会否决我的回答?如果我错了,请告诉我。
  • @juanchopanza 好的,我明白你的意思。做了一些研究并修复了它。
  • @juanchopanza 感谢您的建设性批评。
【解决方案2】:

对于其他人: 检查您是否真的在#include &lt;random&gt; 中包含随机。我没有它,并且之前包含了其他一些标题。现在该标头已更新,但我收到了此错误,并且有一段时间没有找到它,因为我正在检查编译器设置。

【讨论】:

  • 这也应该包含在你的头文件中。
【解决方案3】:

您的问题是您没有使用 C++11 进行编译。 ;-)(对不起,忍不住了。)

GCC 4.4.7 发布于 2012 年 3 月。该版本尚未完成对 C++11 的支持。

截至撰写本文时,GCC 的当前版本是 5.2.0... 符合 C++14。是时候更新你的编译器了。 ;-)

【讨论】:

  • 问题是,我不能,因为这是一台我不拥有的远程机器。
  • @Hagadol:请机器的所有者更新系统。如果 GCC 这么旧,那么其他组件可能也是如此。过时的系统软件不仅仅是令人讨厌,它是一个安全风险。 (想想 SSL 中最近才修复的错误,仅举一个例子。)如果是客户,请告诉他您不能保证在这样一台过时的机器上正常运行。如果是供应商,要求为您提供最新的系统软件。如果您无法执行(或启动其他人执行)此操作,您将需要一个不同的解决方案来解决您的随机性。
  • @Hagadol:说了这么多,请注意,为您的用户安装最新的编译器(而不是更新系统编译器)并不是什么大问题。 ./configure --prefix=${HOME}/.local_software &amp;&amp; make install 加上export PATH=${HOME}/.local_software:${PATH}。但是请注意,您可能使用该编译器生成的任何库可能与 system 编译器不兼容...
【解决方案4】:

我不想推荐这个,但在你的情况下(旧的不可触碰的机器)我可以提供一个建议。 tr1版本的随机库应该是g++-4.4可用的:

#include <tr1/random>
int main(int argc, char *argv[]){
    std::tr1::default_random_engine generator;
    return 0;   
}

std 版本相对于tr1 版本有所改进,但您应该能够使用大多数&lt;random&gt; 功能。

你甚至不需要 C++0x。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    相关资源
    最近更新 更多