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
的问题。我怎样才能解决这个问题?
请勿转发声明Odp
。编译器不知道std::vector<Odp>
的类型是什么,因为Odp
尚未声明。为编译器提供该类的完整声明。
但是如果我也想在其他地方宣布它呢? – 2010-06-15 00:44:48
@Rosarch:你可以在任何你想要的地方声明这个类。你只能定义一次。将它定义在需要定义的任何地方。 – 2010-06-15 00:55:53
没错,但我试图避免在其他头文件中包含头文件。 – 2010-06-15 00:56:24
std::vector
需要第一个模板参数的完整类型声明,因为它按值而不是指针存储对象,因此需要了解对象大小。如果您存储指针在矢量你可能会逃脱向前声明,如:
class foo;
typedef std::vector<foo*> foo_ptr_vec;
的血淋淋的细节见the fine documentation。
Foo命名空间中缺少分号是拼写错误? – nevets1219 2010-06-15 00:44:06
另请参阅[您可以使用前向声明无法做到的事情列表](http://stackoverflow.com/questions/553682/when-to-use-for-forward-declaration/553869#553869)。 – 2010-06-15 00:44:18
@ nevets1219是的,这是一个错字 – 2010-06-15 00:45:19