"random_shuffle":不是"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
  • 知道问题可能是什么吗?

谢谢!

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(( 和旧东西

三、什么必须死

D.12 "Random shuffle" [depr.alg.random.shuffle]

这定义了random_shuffle(第一个,最后一个(和random_shuffle(第一个, 最后,RNG(。(后者采用随机数生成器,其 要求与 C++11 完全不同 统一随机数生成器。

random_shuffle(第一个,最后一个(的问题在于它被允许 使用 rand((,它允许质量低。 (rand(( 是偶数 允许引入数据竞赛,26.8 [c.math]/5,虽然我不是 知道这样做的任何实现。 建造mt19937骨灰盒 调用shuffle(first,last,urng(是一个更好的选择。 不像random_shuffle(第一个,最后一个(,调用随机播放(第一个,最后一个,骨灰盒( 要求用户知道 URNG 的存在和状态,但我 争辩说这是一个功能,而不是一个错误。

random_shuffle(first, last, rng(是高德纳洗牌算法。它 不是邪恶的,但在实践中几乎无法使用,因为"RNG" 函数对象需要提供一个非常奇怪的接口。(这是 实际需要返回 变化间隔,这很难在不引入偏差的情况下实现。 shuffle(first,last,urng(非常易于使用,因为它 直接消耗一个 URNG。


Visual Studio C++标准版本。

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

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

可能是试图尽可能接近C++17。

TLDR:

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

详细解释:

我在尝试使用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
}

正如你所看到的,由于视觉工作室中的这个问题,它总是分支到错误的代码段,因此失败.
要解决此问题,只需在Properties > C/C++ > Command Line中设置/Zc:__cplusplus标志,您就可以开始了。

从Microsoft:

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

言论


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

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

请务必在此处阅读实际文章

最新更新