gpt4 book ai didi

前向声明类的 unique_ptr 的 C++11 容器

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:15:08 26 4
gpt4 key购买 nike

g++ -std=c++11 不会编译包含容器的类,该容器包含指向前向声明类的唯一指针。问题:

  • 为什么?
  • 是否有合理的解决方法?

代码示例:

#include <vector>
#include <memory>

// variant 1 (with full class definition): compiles
class Bar { [..] };
using BarPtr = std::unique_ptr<Bar>;

// variant 2 (with shared instead of unique pointers): compiles
using BarPtr = std::shared_ptr<class Bar>;

// variant 0 (which is what we want): compilation fails below
using BarPtr = std::unique_ptr<class Bar>;

// end of variants

class Foo {
std::vector<BarPtr> vec;
public:
Foo() {} // compilation of variant 0 fails here:
// In instantiation of ‘void std::default_delete<Bar>::operator()(Bar*) const
// ...
// invalid application of ‘sizeof’ to incomplete type ‘Bar’
};

我看过How to forward declare a class to be used in a standard container of unique_ptrIs std::unique_ptr<T> required to know the full definition of T? , 但没有找到令人信服的答案来回答我的上述问题。

最佳答案

您需要将 Foo 的那些部分移动到实现文件中,这需要 Bar 的完整定义(请参阅 Howard Hinnant 的表格:https://stackoverflow.com/a/6089065/2173029)。按照这个指南,编译:

#include <vector>
#include <memory>

class Bar;
using BarPtr = std::unique_ptr<Bar>;

class Foo {
std::vector<BarPtr> vec;
public:
Foo(); // Needs Bar in implementation
~Foo();// Needs Bar in implementation
};

关于前向声明类的 unique_ptr 的 C++11 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34627874/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com