C++:未知指针大小声明时向前(错误C2036)

C++:未知指针大小声明时向前(错误C2036)

问题描述:

在一个标题文件,我已经向前声明一个命名空间的两个成员:C++:未知指针大小声明时向前(错误C2036)

namespace Foo { 
    struct Odp 
    typedef std::vector<Odp> ODPVEC; 
}; 

class Bar 
{ 
public: 
    Foo::ODPVEC baz; // C2036 
}; 

由编译器生成的错误是:

error C2036: 'Foo::Odp *': unknown size 

我猜这是一个正向申报Odp的问题。我怎样才能解决这个问题?

+1

Foo命名空间中缺少分号是拼写错误? – nevets1219 2010-06-15 00:44:06

+2

另请参阅[您可以使用前向声明无法做到的事情列表](http://*.com/questions/553682/when-to-use-for-forward-declaration/553869#553869)。 – 2010-06-15 00:44:18

+0

@ nevets1219是的,这是一个错字 – 2010-06-15 00:45:19

请勿转发声明Odp。编译器不知道std::vector<Odp>的类型是什么,因为Odp尚未声明。为编译器提供该类的完整声明。

+0

但是如果我也想在其他地方宣布它呢? – 2010-06-15 00:44:48

+0

@Rosarch:你可以在任何你想要的地方声明这个类。你只能定义一次。将它定义在需要定义的任何地方。 – 2010-06-15 00:55:53

+0

没错,但我试图避免在其他头文件中包含头文件。 – 2010-06-15 00:56:24

std::vector需要第一个模板参数的完整类型声明,因为它按值而不是指针存储对象,因此需要了解对象大小。如果您存储指针在矢量你可能会逃脱向前声明,如:

class foo; 
typedef std::vector<foo*> foo_ptr_vec; 

的血淋淋的细节见the fine documentation