c++ - 相互依赖的 C++ 类,由 std::vector 持有

标签 c++ vector

我很好奇是否可以创建两个类,每个类都有一个 std::vector的另一个。我的第一个猜测是这是不可能的,因为 std::vector需要一个完整的类型,而不仅仅是一个前向声明。

#include <vector>

class B;
class A { std::vector<B> b; };
class B { std::vector<A> a; };

我认为 std::vector<B> 的声明会导致立即失败,因为 B此时有一个不完整的类型。但是,这在 gcc 和 clang 下都能成功编译,没有任何警告。为什么这不会导致错误?

最佳答案

T.C 评论说,这实际上是未定义的行为,正在对标准的更改请求中解决。违反的规则显然是 [res.on.functions] 2.5:

In particular, the effects are undefined in the following cases: [...]

  • if an incomplete type (3.9) is used as a template argument when instantiating a template component, unless specifically allowed for that component.

不管怎样都行得通的原因(以及可以标准化的原因)有两个方面:

  1. 你的程序只包含类型定义;不创建对象,不调用函数,不生成代码。如果我们通过消除 B 的定义来简化它(不需要它),然后尝试创建 A 的实例,它失败了:

    class B;
    class A { std::vector<B> b; };
    A a; // error: ctor and dtor undefined for incomplete type B.
    

    正如预期的那样,同样失败的是一个简单的

    std::vector<B> b;
    

    这两种情况的原因是编译器必须生成代码,而不是仅仅在语法上相关的类型声明。

    vector type的使用在其他情况下也是可以的:

    typedef std::vector<B> BVec;
    
  2. A可以定义,因为正如 Nikolay 在他的回答中正确所说,std::vector<B> 的大小,因此 A 的大小的成员(member)b , 不依赖于 B 的定义(因为 vector 包含指向元素数组的指针,而不是数组本身)。

关于c++ - 相互依赖的 C++ 类,由 std::vector 持有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35461561/

相关文章:

c++ - 在C++中获取Z3中位 vector 的数值

c++ - 空白屏幕 OpenGL

c++ - Opencv 人脸变形

c++ - C++ 中的 Postfix 不像我期望的那样表现

r - 如何在向量中累积条纹

c++ - 如何将 vector<string> 的元素复制到字符串中?

c++ - 是否有 "safe"static_cast 替代方案?

c++ - 传递标准 vector 作为引用 : no matching function to call

c++ - vector <double> 类型错误

c++ - vector<wstring> 作为返回值和参数