在头文件中,我已向前声明了名称空间的两个成员:
namespace Foo {
struct Odp
typedef std::vector<Odp> ODPVEC;
};
class Bar
{
public:
Foo::ODPVEC baz; // C2036
};
编译器生成的错误是:
error C2036: 'Foo::Odp *': unknown size
我猜这是向前声明Odp
的问题。我怎么能绕过这个?
答案 0 :(得分:3)
请勿转发声明Odp
。编译器不知道std::vector<Odp>
的类型是什么,因为尚未声明Odp
。为编译器提供该类的完整声明。
答案 1 :(得分:3)
std::vector
需要第一个模板参数的完整类型声明,因为它按值存储对象,而不是指针,因此需要了解对象大小。如果将指针存储在向量中,您可能会使用前向声明,例如:
class foo;
typedef std::vector<foo*> foo_ptr_vec;
有关血腥的详细信息,请参阅the fine documentation。