2015-11-02 58 views
3
成员

我发现有很多问题,这个话题,但所有的问题似乎与不使用C++ 11.我的代码编译为“default_random_engine”不是性病

#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。

任何想法?

+0

GCC版本4.4很旧,不支持所有的C++ 11标准。值得注意的是随机数功能缺失。 –

+0

你可以在远程机器上安装任何东西吗?还是它安装了“boost”? – juanchopanza

+1

使用Boost或TR1随机库。对于后者,'#include '。我不认为它有'default_random_engine',所以你必须使用别的东西,也许'std :: tr1 :: mt19937' – Praetorian

回答

4

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

它在加入GCC-4.5

改进为即将到来的ISO C++标准实验支持, 的C++ 0x,包括:

支持<future><functional><random>

参考: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在默认情况下对适当的C++ libraies以使gcc链接。

+0

尝试了这一点,但它会产生相同的错误。 – Hagadol

+0

嗯..为什么会有人downvote我的答案?告诉我,如果我错了。 –

+0

@juanchopanza好的,我明白你的意思了。做了一些研究并修正了它。 –

1

你的问题是你没有用C++ 11编译。 ;-)(抱歉,无法抗拒)

GCC 4.4.7的日期为2012年3月.C++ 11支持尚未在该版本中完成。

截至本文撰写之时,当前版本的GCC为5.2.0 ...这是C++ 兼容。有时间更新你的编译器。 ;-)

+0

事情是,我不能因为这是一个我不拥有的远程机器。 – Hagadol

+0

@Hagadol:错误的机器所有者来更新系统。如果海湾合作委员会那么古老,其他组件可能也是如此。过时的系统软件不仅仅是麻烦,它还是**安全风险**。 (考虑一下刚刚修复的SSL中的错误,仅举一个例子。)如果是客户,告诉他你不能保证在这样一个过时的机器上的正确行为。如果它是一个提供商,*需求*最新的系统软件为您的钱。如果你无法做到这一点(或启动其他人这样做),你需要针对你的随机性采用不同的解决方案。 – DevSolar

+0

@Hagadol:说到这一切,请注意,为用户安装最新的编译器(而不是更新系统编译器)并不是什么大问题。 './configure --prefix = $ {HOME} /。local_software && make install' plus'export PATH = $ {HOME} /。local_software:$ {PATH}'。但是,请注意,使用该编译器生成的任何库可能与* system *编译器不兼容...... – DevSolar

0

我讨厌推荐这个,但在你的情况(旧的不可触摸的机器)我可以提供一个建议。随机库的tr1版本应该可用于g ++ - 4。4:

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

目前已在相对std版本改进tr1版本,但你应该能够使用最<random>功能。

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