C++ C++;洗牌向量

C++ C++;洗牌向量,c++,c++11,C++,C++11,我已经看到了关于这个问题的其他线索,但似乎没有一条能够回答我的问题。我试图在向量上使用shuffle()函数,但我一直收到一个错误: deck_of_cards.cpp:34:5: error: no matching function for call to 'shuffle' shuffle (deck.begin(), deck.end(), std::default_random_engine(seed)); ^~~~~~~ /Applications/Xcode.app/Content

我已经看到了关于这个问题的其他线索,但似乎没有一条能够回答我的问题。我试图在向量上使用
shuffle()
函数,但我一直收到一个错误:

deck_of_cards.cpp:34:5: error: no matching function for call to 'shuffle'
shuffle (deck.begin(), deck.end(), std::default_random_engine(seed));
^~~~~~~
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/algorithm:3049:10: note: candidate function [with
  _RandomAccessIterator = std::__1::__wrap_iter<Card *>, _UniformRandomNumberGenerator = std::__1::linear_congruential_engine<unsigned int, 48271, 0,
  2147483647>] not viable: expects an l-value for 3rd argument
void shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
     ^
1 error generated.

我的程序中确实包含了所有正确的
#includes
。我对C++是相当新的,这基本上是一个java程序,我尝试将它转换成C++。任何帮助都将不胜感激

编译器告诉您它需要一个左值ar第三个参数,而您给它一个右值(以临时对象的形式)

试试这个:

 auto gen = std::default_random_engine(seed);
 shuffle (deck.begin(), deck.end(), gen);

请注意,应该接受右值作为第三个参数,这样符合标准的实现就会接受您的代码。

您是否已经尝试了
std::shuffle
?对于所有其他引用,您使用<代码> STD< /COD>命名空间,为什么不使用<代码> Suffle()/Cuth>函数?我已经尝试过了,在C++引用页面上,它把它排除在外,所以我想我会尝试一下。但这两种方法都不起作用@πάνταῥεῖ, 从技术上讲,ADL无论如何都会找到它,尽管我个人会明确指定它。那就是。。。真奇怪,你用的是什么编译器?不会的。我唯一的猜测是您的stdlib缺少正确的重载
std::shuffle
。ADL还有最后一个参数。不管
deck
的迭代器类型如何,这种方法都能工作吗?我不知道std::shuffle有任何重载。我看到的每个引用只显示一个声明。@shawn1874你说得对,它不是重载。它是一个带有“通用引用”的模板函数,因此它应该能够捕获一个右值,不会有任何问题。
 auto gen = std::default_random_engine(seed);
 shuffle (deck.begin(), deck.end(), gen);