2009-11-06 303 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