2014-04-16 77 views
1

我在標題中包含了「不使用字符串」部分,因爲當我在這裏尋找答案時,我看到這個問題很多,但它與人使用字符串和混淆字符。這不是我的問題。IOS C++禁止在指針和整數之間進行比較(不使用字符串)

嘗試調用2D矢量的元素並查看它是否等於某個數。我得到指針/整數錯誤之間的比較,我不明白爲什麼。這是我的代碼,任何幫助將非常感激。

bool UsedInRow(vector< vector<int> > vec(int n, vector<int> (int n)), int row, int num) 
{ 

    int n; 

    for (int col = 0; col < n; col++) 
    { 
    if (vec[row][col] == num) 
    { 
     return true; 
    } 
    } 
return false; 
} 

回答

4

試試這個:

bool UsedInRow(const vector< vector<int> >& vec, int row, int num) { ... } 

您使用vector< vector<int> > vec(int n, vector<int> (int n))的表達實際上是一個函數指針。

+0

你怎麼能確定它不是一個函數指針?如果它應該是一個向量,爲什麼嵌套參數列表在第一位呢? (直到OP解釋我們纔會知道答案。) –

+1

@KeithThompson:他使用'vec'就像一個二維數組,而不是一個函數指針。所以我申請了Occam的剃鬚刀。 – Danvil

+0

你可能是對的 - 但肯定是'(int n,vector (int n))'不只是一個隨機的錯字。該代碼包含一個非常複雜且完全有效的函數聲明,它接受一個函數指針參數,其中指向函數本身需要另一個函數指針參數。這裏還有其他的東西(我不知道是什麼)。 –

1

編譯器認爲你傳遞了一個函數指針。

相反,通過引用傳遞vector

bool UsedInRow(vector< vector<int> > &vec, int row, int num) 
+2

我不會稱之爲* vexing parse *,在這種特殊情況下,它顯然是**正在傳遞的函數簽名!最令人頭疼的解析通常是指聲明可以被解析爲變量或函數聲明,後者在語言中是首選的情況,但這裏不存在這樣的歧義 –

+0

什麼是煩人的是有一個函數作爲參數傳遞,但在比較代碼中完全忽略了這一點,在這種情況下,它被視爲傳入了引用。通過循環的每次迭代重新創建'vec'結構似乎是錯誤的,而接收預先存在的'vec'是有意義的。 – tadman

0

作爲其他的答案指出,vec是一個函數指針,而不是一個矢量。

建議您將vec更改爲矢量,但尚不清楚這是否是正確的解決方案。你的聲明沒有歧義; vec被定義爲函數指針類型的參數。

如果這是你的意圖,你需要用函數調用來替換函數內的參考vec。例如,你可能會改變

if (vec[row][col] == num) 

if ((vec(42, something))[row][col] == num) 

其中something本身必須是一個函數指針,指向接受一個int參數和返回vector<int>結果的功能。

您的UsedInRow函數聲明相當複雜,我不知道它是如何使用的。

如果vec真的應該只是一個向量,那麼你可以通過刪除參數聲明中的(int n, vector<int> (int n))部分來做到這一點 - 但我不得不想知道爲什麼你把它寫在第一位。

爲了得到明確的答案,您需要向我們解釋您的UsedInRow函數應該做什麼。

相關問題