我认为你只能为前向声明的类创建一个引用或指针成员。但是,我很惊讶地发现这有效:
#include <vector>
struct Donkey;
struct Cage
{
std::vector<Donkey> donkeys;
};
struct Donkey
{
};
int main()
{
Cage c;
}
如何使用前向声明的类定义std::vector
?这是标准吗?
答案 0 :(得分:5)
实际上,你不能
仅仅因为你的程序编译(这取决于底层实现的事实)并不意味着它是有效的。
There are times other than declaring a T*
or a T&
at which you may use a forward declaration;只是this is not one of them。
答案 1 :(得分:0)
这是未定义的行为。
[C ++ 14/§17.6.4.8] 1在某些情况下(替换函数,处理程序 函数,用于实例化标准库的类型的操作 模板组件),C ++标准库依赖于组件 由C ++程序提供。如果这些组件不符合他们的要求 要求,标准对此没有要求 实现。
[C ++ 14/§17.6.4.8] 2特别是,效果未定义 以下情况:[...]
- 如果在实例化模板组件时将不完整类型(3.9)用作模板参数,除非特别允许 该组件。
此外,不完整类型不符合分配器要求:
[C ++ 14/§17.6.3.5] 9分配器可以约束它所使用的类型 可以实例化其构造成员的参数 可能被称为。如果某个类型不能与特定分配器一起使用, 分配器类或对构造的调用可能无法实例化。
因为你的类在向量被实例化时有一个定义,所以没关系。请留意此提案,该提案将更改分配器要求N4056 Minimal incomplete type support for standard containers