2009-11-06 301 views
0

我很困惑。無類型聲明

我這樣做:

#include <vector> 

// List iteration 
typedef vector<registeredObject>::iterator iterator; 
typedef vector<registeredObject>::const_iterator const_iterator; 
vector<registeredObject>::iterator begin(void); 
vector<registeredObject>::const_iterator begin(void) const; 
vector<registeredObject>::iterator end(void); 
vector<registeredObject>::const_iterator end(void) const; 

我得到這樣的錯誤:

.: error: ISO C++ forbids declaration of 'vector' with no type 
.: error: expected ';' before '<' token 

爲載體的上述用途中的每一個。此代碼在較舊的CodeWarrior中編譯,但XCode抱怨。什麼是問題?

有沒有很好的參考?

[編輯]這裏是整個頭Here

+0

哪條特定的行會出錯。 – jmucchiello 2009-11-06 01:40:26

回答

13

vector在命名空間std

typedef std::vector<registeredObject>::iterator iterator; 

而且,爲什麼你定義這些類型則沒有使用它們?

typedef std::vector<registeredObject> container; 
typedef container::iterator iterator; 
typedef container::const_iterator const_iterator; 

iterator begin(void); 
const_iterator begin(void) const; 
iterator end(void); 
const_iterator end(void) const; 

另外考慮到也許你還沒有定義registeredObject。請用int來確認。


現在我們看到registeredObject是一個模板參數,你需要typename

typedef typename std::vector<registeredObject> container; 
typedef typename container::iterator iterator; 
typedef typename container::const_iterator const_iterator; 

Here's why.不要忘了其他的東西,雖然。您仍然需要std::,並且實際使用您定義的類型。 (這個必須在你的兩個類中都被修復。)

注意它是很多更常見使用T作爲模板類型。它當時也是常見的要大方你typedef的:

typedef T value_type; 
typedef std::vector<value_type> container; 
typedef typename container::iterator iterator; 
typedef typename container::const_iterator const_iterator; 

而在你的課堂上使用這些。 (即用container mRegistryList;代替)

+0

@Gman-不確定我是否理解爲在使用向量之前似乎無法使用std ::。我發佈了上面課程的鏈接。我認爲這是使我感到困惑的模板。 – 2009-11-06 01:33:49

0

是否被registeredObject聲明?你有包含RegisteredObject.h嗎?

0

如果我不得不猜測,我會說 registeredObject類型是在某個文件中定義的,但不包含在此頭文件中。

一個.cpp文件中可能發生的事情,包括 RegisteredObject.h MyIteratorDeclarations.h,這是可行的。但是之後的另一個文件可能只包括 MyIteratorDeclarations.h,這會產生一個錯誤。

目前沒有足夠的代碼供應。也許你可以改變你的例子,直到第一個錯誤顯示所有的頭文件內容。

+0

@Andrew:我在上面的鏈接中發佈了類作爲txt文件。 – 2009-11-06 01:34:31