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

时间:2010-06-15 00:41:17

标签: c++ syntax compiler-errors forward-declaration

在头文件中,我已向前声明了名称空间的两个成员:

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

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

编译器生成的错误是:

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

我猜这是向前声明Odp的问题。我怎么能绕过这个?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

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

有关血腥的详细信息,请参阅the fine documentation