' random_shuffle':不是' std'的成员。错误

时间:2017-07-10 13:57:33

标签: c++ std

我尝试使用std::random_shuffle,并收到编译错误。

我的编译器是v140(Visual Studio 2015),我使用x64,发布模式。

我的代码:

#include <random>
#include <algorithm>
void foo()
{
    std::vector<int> v;
    std::random_shuffle(v.begin(), v.end());
}

我得到的错误:

error C2039: 'random_shuffle': is not a member of 'std'
error C3861: 'random_shuffle': identifier not found
  • 知道问题是什么吗?

谢谢!

3 个答案:

答案 0 :(得分:8)

使用toolchain v140的默认设置编译代码。但是,如果添加选项/std:c++latest,则删除的标准库部分可能不再可用。

可能尝试尽可能接近C ++ 17。

答案 1 :(得分:5)

random_shuffle在C ++ 14中已弃用,在C ++ 17中已完全删除。

您需要使用shuffle,它将随机生成器作为参数。

您可以在网站上看到一个简单示例:

std::random_device rd;
std::mt19937 g(rd());

std::shuffle(v.begin(), v.end(), g);

<强> n4190

  

删除auto_ptr,random_shuffle()和Old Stuff

     

...

     

III。什么必须死?

     

D.12&#34;随机随机播放&#34; [depr.alg.random.shuffle]

     

这定义了random_shuffle(first,last)和random_shuffle(首先,   最后,rng)。 (后者采用RandomNumberGenerator,其中   要求与C ++ 11完全不同   UniformRandomNumberGenerator。)

     

random_shuffle(第一个,最后一个)的问题是它被允许   使用rand(),允许低质量。 (兰德()是偶数   允许引入数据竞赛,26.8 [c.math] / 5,尽管我不是   知道这样做的任何实现。)构造mt19937 urng   并且调用shuffle(first,last,urng)是一个非常优越的选择。   与random_shuffle(first,last)不同,调用shuffle(first,last,urng)   要求用户了解URNG的存在和状态,但我   认为这是一个功能,而不是一个错误。

     

random_shuffle(first,last,rng)是Knuth shuffle算法。它&#39; S   不是邪恶的,但它在实践中几乎无法使用,因为&#34; rng&#34;   函数对象需要提供一个非常奇怪的接口。 (它&#39; S   实际上需要在a上返回一个统一的整数分布   变化的间隔,如果不引入偏差就很难做到。)   shuffle(first,last,urng)非常容易使用,因为它   直接消费URNG。

Visual Studio C ++标准版。

gccclang不同,Visual Studio不提供选择标准版本的选项,因此弹出的问题是:哪个C ++标准会实现? 答案是......既不是......也不是每一个。最后我检查了他们的理念是他们努力慢慢地达到最新的标准版本,但不是标准版本的步骤,即他们正在实现C ++ 14功能,而C + 11还没有完全实现。因此,您将看到C ++ 11的某些部分已实现,C ++ 14的某些部分已实现,部分C ++ 17已实现。

答案 2 :(得分:0)

TLDR:

我在Visual Studio中遇到此错误。
要解决此问题,只需在/Zc:__cplusplus中设置Properties > C/C++ > Command Line标志就可以了。

详细说明:

尝试使用Hayai时遇到了这个问题。在Visual Studio中,__cplusplus始终设置为199711L,并且Hayai也会由于以下原因而在Visual Studio中进行检查:

        /// Randomly shuffles the order of tests.
        static void ShuffleTests()
        {
            Benchmarker& instance = Instance();
#if __cplusplus > 201100L
            std::random_device rd;
            std::mt19937 g(rd());
            std::shuffle(instance._tests.begin(),
                         instance._tests.end(),
                         g);
#else
            std::random_shuffle(instance._tests.begin(),
                                instance._tests.end());
#endif
        }

正如您在Visual Studio中看到的那样,它总是分支到错误的代码段中,因此失败。
要解决此问题,只需在/Zc:__cplusplus中设置Properties > C/C++ > Command Line标志就可以了。

从Microsoft:

/Zc:__cplusplus编译器选项启用__cplusplus 预处理程序宏,用于报告最新C ++语言的更新值 标准支持。默认情况下,Visual Studio始终返回该值 __cplusplus预处理程序宏为“ 199711L”。

备注


__cplusplus预处理程序宏通常用于报告支持 适用于特定版本的C ++标准。因为很多现有的 代码似乎取决于此匹配“ 199711L”的宏的值, 编译器不会更改宏的值,除非您 使用/Zc:__cplusplus编译器选项显式选择加入。的 从Visual Studio 2017开始,/Zc:__cplusplus选项可用 版本15.7,默认情况下处于关闭状态。在早期版本的Visual中 Studio,默认情况下,或者如果指定了/Zc:__cplusplus-,则为Visual Studio为__cplusplus预处理器返回值“ 199711L” 宏。 /permissive-选项不会启用/Zc:__cplusplus

启用/Zc:__cplusplus选项后, __cplusplus宏取决于/std版本开关的设置。下表显示了该宏的可能值:

请务必阅读实际的文章Here