2011-10-22 86 views
-2

我得到這個錯誤:有麻煩通過指針數組功能,其他功能

error C2664: 'KaibaMainPhase' : cannot convert parameter 1 from 
'void (__cdecl *[2])(std::vector<_Ty> &, 
std::vector<_Ty>&, 
std::vector<std::vector<_Ty>> &, 
std::vector<_Ty> &,std::vector<_Ty> &)' 
to 'void (__cdecl *)(std::vector<_Ty> &, 
std::vector<Card> &, 
std::vector<Card> &)" 

這裏是我的代碼:

class Card 
{ 
public: 
string GetName() {return Name;} 
void SetName(const string& setName) {Name = setName; } 
void SetType(const string& setType) {Type = setType; } 

private: 
string Name; 
string Type; 
}; 

vector< vector<Card> > Field(4, vector<Card>(5)); 
vector<Card> KaibaHand; 
vector<Card>::iterator KH; 
vector<Card> YugiHand; 
vector<Card>::iterator YH; 

vector<Card> KaibaGraveyard; 
vector<Card>::iterator KG; 
vector<Card> YugiGraveyard; 
vector<Card>::iterator YG; 


void KaibaBeginning(vector<Card> &KaibaHand, vector<Card> &KaibaDeck); 
void DrawForKaiba(vector<Card> &KaibaHand, vector<Card> &KaibaDeck); 
void KaibaMainPhase(void (*)(vector< vector<Card> > &Field, vector<Card> &KaibaGraveyard, 
vector<Card> &YugiGraveyard), vector<Card> &KaibaHand, vector<Card> &KaibaDeck, vector< 
vector<Card> > &Field, vector<Card> &YugiGraveyard, vector<Card> &KaibaGraveyard); 


void FieldFunction(vector< vector<Card> > &Field); 
void KaibaHandFunction(vector<Card> &KaibaHand); 
void KaibaGraveyardFunction(vector<Card> &KaibaGraveyard); 
void YugiGraveyardFunction(vector<Card> &YugiGraveyard); 
void KaibaSummon(vector< vector<Card> > &Field, vector<Card> &KaibaHand, int HandNumber, int 
MonstCount); 
void YugiSummon(vector< vector<Card> > &Field, vector<Card> &YugiHand, int HandNumber, int 
MonstCount); 
void KaibaDiscard(int HandNumber, vector<Card> &KaibaHand, vector<Card> &KaibaGraveyard); 
void YugiDiscard(int HandNumber, vector<Card> &YugiHand, vector<Card> &YugiGraveyard); 


void KaibaMainPhase(void (*)(vector< vector<Card> > &Field, vector<Card> &KaibaGraveyard, 
vector<Card> &YugiGraveyard), vector<Card> &KaibaHand, vector<Card> &KaibaDeck, 
vector<vector<Card> > &Field, vector<Card> &YugiGraveyard, vector<Card> &KaibaGraveyard); 


void HEAVYSTORM(vector<Card> &KaibaHand, vector<Card> &KaibaDeck, vector< vector<Card> > &Field, 
vector<Card> &KaibaGraveyard, vector<Card> &YugiGraveyard) 
{ 
cout<<"This card destroys ALL magic and traps cards on the field!!"<<endl; 
    for (int i=0; i<5; i++) 
    { 
     YugiGraveyard.push_back(Field[0][i]); 
    Field[0][i]=Card(); 
     KaibaGraveyard.push_back(Field[3][i]); 
     Field[3][i]=Card(); 
    } 
} 

void POTOFGREED(vector<Card> &KaibaHand, vector<Card> &KaibaDeck, vector< vector<Card> > &Field, 
vector<Card> &KaibaGraveyard, vector<Card> &YugiGraveyard) 
{ 
DrawForKaiba(KaibaHand, KaibaDeck); 
} 


int main() 
{ 

void (* pFunct[2]) (vector<Card> &KaibaHand, vector<Card> &KaibaDeck, vector< vector<Card> > 
&Field, vector<Card> &KaibaGraveyard, vector<Card> &YugiGraveyard); 
pFunct[0] = HEAVYSTORM; 
pFunct[1] = POTOFGREED; 


KaibaMainPhase(pFunct, KaibaHand, KaibaDeck, Field, YugiGraveyard, KaibaGraveyard); 
} 


void KaibaMainPhase(void (*pFunct)(vector<Card> &KaibaHand, vector<Card> &KaibaDeck, vector< 
vector<Card> > &Field, vector<Card> &KaibaGraveyard, vector<Card> &YugiGraveyard), vector<Card> 
&KaibaHand, vector<Card> &KaibaDeck, vector< vector<Card> > &Field, vector<Card> &YugiGraveyard, 
vector<Card> &KaibaGraveyard) 
{ 
int HandNum; 
cout<<"Enter a number: "<<endl; 
cin>>HandNum; 
cout<<"You played "<<Field[3][HandNum-1].GetName(); 
pFunct[HandNum-1](KaibaHand, KaibaDeck, Field, KaibaGraveyard, YugiGraveyard);// 
} 

void KaibaHandFunction(vector<Card> &KaibaHand) 
{ 
    cout<<endl<<"Kaiba's hand contains: "<<endl; 
    for (KH=KaibaHand.begin(); KH<KaibaHand.end(); KH++) 
    { 
     cout<<KH->GetName()<<endl; 

    } 
} 

void YugiHandFunction(vector<Card> &YugiHand) 
{ 
    cout<<endl<<"Yugi's hand contains: "<<endl; 
    for (YH=YugiHand.begin(); YH<YugiHand.end(); YH++) 
    { 
     cout<<YH->GetName()<<endl; 

    } 
} 

void KaibaGraveyardFunction(vector<Card> &KaibaGraveyard) 
{ 
     cout<<endl<<"Kaiba's graveyard contains: "<<endl; 
     for (KG=KaibaGraveyard.begin(); KG<KaibaGraveyard.end(); KG++) 
     { 
      cout<<KG->GetName()<<endl; //SAME AS (*gt).GetName 
     } 
     cout<<"\n"; 
} 

void YugiGraveyardFunction(vector<Card> &YugiGraveyard) 
{ 
     cout<<endl<<"Yugi's graveyard contains: "<<endl; 
     for (YG=YugiGraveyard.begin(); YG<YugiGraveyard.end(); YG++) 
     { 
      cout<<YG->GetName()<<endl; //SAME AS (*gt).GetName 
     } 
     cout<<"\n"; 
+3

你的錯誤信息應該引用你到一個特定的行。請說明哪一行。另外,考慮從問題中刪除一些不相關的代碼,並*實際*提出問題。我在這裏沒有看到任何問題。 (提示:問題以問號結尾) – abelenky

+2

你知道'typedef'是什麼以及如何使用它? –

+1

我的哀悼,這段代碼看起來難以逾越,無法維持。祝你好運。也許首先將'vector >&Field'這樣的東西分解到它們自己的類中,併爲它們提供一些方法來處理'Field'對象應該做的事情? – sarnold

回答

8

在這一行:

void KaibaMainPhase(void (*)(vector< vector<Card> > &Field, vector<Card> &KaibaGraveyard, vector<Card> &YugiGraveyard), vect.... 

您聲明第一個參數爲KaibaMainPhase將是3個參數的函數。

void KaibaMainPhase(
    /* Function Pointer */ void (*)(
    /* Param #1   */ vector< vector<Card> > &Field, 
    /* Param #2   */ vector<Card> &KaibaGraveyard, 
    /* Param #3   */ vector<Card> &YugiGraveyard), /*other parameters to KaibaMainPhase*/.... 

後來,在此代碼:

pFunct[0] = HEAVYSTORM; 
[...] 
KaibaMainPhase(pFunct, KaibaHand, Kaiba..... 

你傳入pFunct,這是兩種不同的功能的陣列。
數組與函數指針不同。

但是,即使你確實通過了pFunct[0],它也不起作用。 pFunct被聲明爲函數指針陣列,其中每個函數具有參數:

/* Array of 2 fnct ptrs */ void (* pFunct[2])(
/* Param #1 */ vector<Card> &KaibaHand, 
/* Param #2 */ vector<Card> &KaibaDeck, 
/* Param #3 */ vector< vector<Card> > &Field, 
/* Param #4 */ vector<Card> &KaibaGraveyard, 
/* Param #5 */ vector<Card> &YugiGraveyard 
); 

但功能KaibaMainPhase期待一個函數,只需要參數。