1

我有两个问题,第二个是可选的。首先,在下面的程序(一个简单卡片程序的原型)中,我收到以下错误:

(29): 错误 C2660: 'shuffle' : 函数不接受 1 个参数,代码如下:

#include "stdafx.h"
#include <iostream>
#include <sstream>
#include <deque>
#include <algorithm>
using namespace std;

deque<int> cardDeck (51);
void flip(); //Prototype flip()
void shuffle(); //Prototype shuffle()

int _tmain(int argc, _TCHAR* argv[])
{
    ostream& operator<<(ostream& os, deque<int> dq); //overload << operator to accept deque 
                                                       //arguments
    for (int a=52; a>0; a--) { //initialize the 52 cards in a deck 
        cardDeck.push_front(a); 
    }
    flip(); //prompt my input to check data
    return 0;
}

void flip() { //flip over card in specified location in the deck
    int input;
    cin >> input;
    cout<<cardDeck[input]<<endl;
    shuffle(cardDeck);
    flip();
}

void shuffle(deque<int> dq) {  //use Fisher-Yates algorithm to efficiently and accurately 
                               //randomize card order
     for(int i=dq.size()-1; i>-1; i--) { 
         int j = rand() % (i + 1);
         if(i != j) {
             swap(dq[j], dq[i]);
         }
     }
}

为什么我会收到此错误?(我环顾四周并试图自己解决)

其次,我不确定我是否正确地使用了 Fisher-yates 算法,因为在上面不容易找到 c++ 文档(对于使用 swap() 的版本;)(Brownie 指出回答这个问题或指出任何非常糟糕的编码实践,不包括缺少类)

提前致谢!

4

3 回答 3

2

您收到该错误的原因是因为您声明 shuffle为不带任何参数的函数。

void shuffle();

另一个注意事项是,您可能希望在该函数中引用双端队列,否则您将打乱本地副本并且不会产生所需的副作用。

您可能希望它看起来像这样:

void shuffle(deque<int>& dq);

此外,您可能希望使用iter_swap而不是swap交换元素。在出队中,它可能不会有所作为,但对于listmap它会。

于 2011-09-08T04:46:47.277 回答
0

我想你忘了把参数放在你的函数声明中

void shuffle();

应该

void shuffle(deque<int> dq);
于 2011-09-08T04:46:30.990 回答
0

我认为问题在于,在您的程序顶部,您已经将 `shuffle as

void shuffle();

请注意,这不需要任何参数。因为 C++ 使用一次性编译器,所以在调用 shuffle 时,这是唯一可用的 shuffle 声明,因为编译器稍后没有看到实现。因此,它给你上面的错误,因为它认为你正在调用一个带有一个参数的零参数函数。

要解决此问题,请更新原型,使其与您实际定义的函数相匹配。

希望这可以帮助!

于 2011-09-08T04:46:55.667 回答