【问题标题】:Can I omit the type arguments of smart pointers in my header files?我可以在头文件中省略智能指针的类型参数吗?
【发布时间】:2016-11-23 23:26:59
【问题描述】:

我正在构建一个 C++ 库。我有一个struct,其中包含一个std::unique_ptr 到另一个struct,我想对用户隐藏。

例如:

struct MyStruct {
    int x;
  private:
    std::unique_ptr<MyPrivateStruct> y;
};

现在,我需要在用户可以包含的头文件中指定MyStruct,以便他们知道其布局。但是,这要求我还公开 MyPrivateStruct 的标头,我不想这样做。由于 unique_ptr 的大小无论类型如何都是相同的,是否有可能做这样的事情?

struct MyStruct {
    int x;
  private:
    std::unique_ptr<auto> y;
};

y 的类型将由我的cpp 文件确定。


这与Can't use std::unique_ptr<T> with T being a forward declaration 的问题完全不同,因为这个问题的答案是使用前向声明。这个问题是关于使用前向声明时的问题。

【问题讨论】:

  • 只是转发声明结构?还是您想避免这样做?
  • @LogicStuff 不完全;见编辑。
  • 您不需要公开MyPrivateStruct 的标头。你需要转发声明它,就是一行:struct MyPrivateStruct;客户端不需要知道它在头文件中的定义。

标签: c++ package header-files


【解决方案1】:

当然!

struct MyPrivateStruct;

struct MyStruct {
    int x;
  private:
    std::unique_ptr<MyPrivateStruct> y;
};

【讨论】:

  • 虽然对我来说在 Visual Studio 中似乎我必须在 MyStruct 中创建一个空的析构函数并在 cpp 文件中定义它,而不是使用默认值来编译它,因为类型不完整。就像在这个答案中:stackoverflow.com/a/9954553/487892
  • @drescherjm 是的。 ~unique_ptr 将调用其模板类型的析构函数。如果允许生成默认析构函数,它就看不到~MyPrivateStruct 的定义,因为它只是在那个时候前向声明的。
  • 是的,部分痛苦。如果你使用 shared_ptr 代替你没有这个问题,但我不建议仅仅因为这个而使用它。
【解决方案2】:

std::unique_ptr&lt;MyPrivateStruct&gt; y; 中的MyPrivateStruct 不必是完整类型

即可以通过写作转发声明

struct MyPrivateStruct;

在声明y之前。

【讨论】:

  • 错了。 C++ 标准并不坚持它。见gcc.gnu.org/wiki/…
  • 哦,哇,我不知道。也许我不应该仅仅将我的知识建立在我的 Microsoft 工具链上。非常感谢,
  • @FitzwilliamBennet-Darcy VC++ 不符合 number of fronts 上的标准
猜你喜欢
  • 1970-01-01
  • 2019-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-05
  • 1970-01-01
相关资源
最近更新 更多