2012-04-23 52 views
1

我目前得到以下編譯錯誤:列表< T > ::迭代器或語法錯誤?

In function 'int main()': 
error: expected primary-expression before '>' token 
error: missing template arguments before 'i' 
error: expected ';' before 'i' 
error: 'i' was not declared in this scope 

我突出行的第一個錯誤標誌在下面的代碼塊:

// test highscoresfilemanager reading & writing 
/* 
HighScorePair paira("holly", 10); 
HighScorePair pairb("carl", 20); 
*/ 
list<HighScorePair> list; 
//list.push_back(paira); list.push_back(pairb); 
HighScoresFileManager::GetInstance()->ReadFileToList(list); 
list<HighScorePair>::iterator i; //ERROR FLAGS HERE ODDLY 
for(i = list.begin(); i != list.end(); ++i) 
    std::cout << (*i).playerName << " " << (*i).playerScore << std::endl; 

我留下了一些註釋文本我以前用來測試一些東西,因爲我確定那些註釋掉的文本完美地工作,如果它工作正常,我不明白爲什麼我添加的新代碼不起作用,我沒有使用任何新的類或任何東西,我只是試圖得到一個迭代器設置。

我覺得很粗魯,因爲我覺得我基本上是要求某人檢查我的語法,我一直在閱讀它,並認爲我必須在某處丟失一個冒號但是我只是不能看出問題所在!一個新的眼睛將不勝感激!我很感激你可能想要更多的代碼(我可以提供),但正如我所說,如果東西評論出來的工作,然後我認爲新的代碼應該。

回答

3

不要調用變量list

+10

或甚至更好,不要把'std :: list'放入全局命名空間 – jalf 2012-04-23 16:57:28

+0

ohhh我甚至都沒有想到!上帝多麼傻,謝謝你! – Holly 2012-04-23 17:02:02

+0

不會再犯這個錯誤!只需編寫懶惰的測試代碼 – Holly 2012-04-23 17:02:49

1

猜你寫了using namespace std;當你調用與std ::中的函數關聯的變量時,它會拋出編譯錯誤。定義變量時(std :: list),只需使用確切的名稱空間。

3

首先,我假設你在某個地方有using namespace std;; 這通常不是一個好主意。但基本的問題仍然是 (儘管不是list,因爲你會寫`std :: list):你已經定義了一個 局部變量,它的名字與一個更大範圍的符號相同; 局部變量從其聲明的角度隱藏該符號,直到其 超出範圍。所以,直到行:

list< HighScorePair> list; 

list是指你using namespace std;拉入全球範圍內的符號,並且該行後,直到塊的結尾,它 指變量,你剛纔在這裏定義。變量是 不是的一個模板,其類型不支持<,所以list <不是 合法。

作爲一般規則,我會建議不要隱藏姓名。它導致 混亂。另外:類型名稱應該是不合格的名詞(如list), 變量名應該是合格名詞(如currentList)。原則上至少 ;我可以看到這樣一個規則會過度殺傷的案例。

+0

你能否解釋一下你的意思是不合格和合格?這將是非常讚賞:)我的老師說,作爲一個經驗法則自己的類型可以更容易地用大寫字母標識,我傾向於使用駱駝案件的變量,但我願意提出建議。是的,我把名字空間的清晰,但我明白它不是最好的方法,我可能wouldnt如果該項目是更大的。也感謝爲我確定問題,我現在完全理解:) – Holly 2012-04-23 18:19:51

+0

@霍利什麼是合格或不合格取決於上下文,但像「狀態」的東西將是不合格的,作爲「currentState」或「newState」將被限定。作爲一般規則,類型是不合格的名詞,變量和常量限定名詞和功能動詞。但實際上,我覺得這個規則太籠統,不能100%可靠。爲了解析C++,你知道什麼是類型,什麼不是。我個人的規則是類型名稱以大寫字母開頭,所有其他字母都以小寫字母開頭。但任何區分類型的規則都是可以接受的。 – 2012-04-24 07:19:43

相關問題