2016-10-05 95 views
-3
#include <set> 
#include <string> 
using namespace std; 
struct StudInfo{     //declaration of structure 
    string name; 
    int id; 
}; 
int compareID(StudInfo a , StudInfo b){   //Compare function as a parameter 
    if(a.id == b.id) return 0;     //that is being passed to the set s 
    if(a.id < b.id) return -1; 
    else return 1; 
} 
int main(){ 
    set<StudInfo> s(CompareID); 
    return 0; 

} 

裏面的主()範圍我正在此錯誤(錯誤C2065:CompareID:未聲明的標識符)儘管在視頻講座使這一代碼是相同的代碼被編譯成功 書面請幫忙。錯誤集宣言C++

+2

大小寫事項。再次檢查拼寫和外殼。 –

+1

您的函數以小寫'c'開頭,但是您給出'CompareID',它以大寫'C'開頭? – piwi

+2

另外,請看'std :: set'中使用的比較要求。你的不符合他們。它必須建模一個比較少的類型。 – juanchopanza

回答

1

黃金法則編程:99.9%的編譯錯誤是由於你,不是的編譯器。

雖然相同的代碼是在視頻講座 使這一代碼編寫

不,它沒有編譯成功!

我如何知道?那麼,這很簡單。首先,我打折編譯器出錯的可能性。然後,我可以專注於源代碼的編譯器輸出。

解決方法很簡單:將set<StudInfo> s(CompareID);替換爲set<StudInfo> s(compareID);。仔細記下這個案例。

編譯完成。

然後我們可以繼續您的運行時行爲。您的比較器功能未正確指定;您需要

bool compareID(const StudInfo& a, const StudInfo& b){ 
    return a.id < b.id; 
} 

更換功能的比較必須爲所有的情況下返回false其中a.id小於b.id。注意我通過const引用傳遞參數以避免不必要的字符串副本。

+0

完成,直到比較器問題在運行時出現。 – juanchopanza

+0

構造函數不需要函數而不是函數嗎?像在http://stackoverflow.com/questions/2620862/using-custom-stdset-comparator? – Philipp

+0

如果你需要require * state *,那麼你可以使用一個仿函數,如果你不那麼常規函數就足夠了。這些天酷貓使用lambda。 – Bathsheba