3

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

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

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

编译器产生的错误是:

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

我猜这是前向声明的问题Odp。我怎样才能解决这个问题?

4

2 回答 2

3

不要转发声明Odp。编译器不知道类型std::vector<Odp>是什么,因为Odp还没有声明。为编译器提供该类的完整声明。

于 2010-06-15T00:43:36.420 回答
3

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

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

有关详细信息,请参阅详细文档

于 2010-06-15T00:58:06.617 回答