我可以在头文件中省略智能指针的类型参数吗? 我正在构建一个C++库。我有一个结构,它包含一个std::unique_ptr到另一个我想对用户隐藏的结构

我可以在头文件中省略智能指针的类型参数吗? 我正在构建一个C++库。我有一个结构,它包含一个std::unique_ptr到另一个我想对用户隐藏的结构,c++,package,header-files,C++,Package,Header Files,例如: struct MyStruct { int x; private: std::unique_ptr<MyPrivateStruct> y; }; 然后,y的类型将由我的cpp文件确定 这与问题不完全相同,因为这个问题的答案是使用远期声明。这个问题是关于使用转发声明时的一个问题 当然 struct MyPrivateStruct; struct MyStruct { int x; private: std::unique_ptr<

例如:

struct MyStruct {
    int x;
  private:
    std::unique_ptr<MyPrivateStruct> y;
};
然后,y的类型将由我的cpp文件确定

这与问题不完全相同,因为这个问题的答案是使用远期声明。这个问题是关于使用转发声明时的一个问题

当然

struct MyPrivateStruct;

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

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

也就是说,您可以通过书面形式转发声明

结构MyPrivateStruct

在std::unique\u ptr y中声明y.

MyPrivateStruct之前;不必是完整类型

也就是说,您可以通过书面形式转发声明

结构MyPrivateStruct


在声明y之前。

只需向前声明结构?或者这就是你试图避免做的事情吗?@LogicStuff的可能重复不完全;请参阅编辑。您不需要公开MyPrivateStruct的标题。您需要向前声明它,这是一行:struct myprivatestuct;客户端不需要知道其头文件中的任何定义。只需向前声明结构即可?或者这就是你试图避免做的事情吗?@LogicStuff的可能重复不完全;请参阅编辑。您不需要公开MyPrivateStruct的标题。您需要向前声明它,这是一行:struct myprivatestuct;客户端不需要知道其头文件中的任何定义。尽管对于我来说,在Visual Studio中,似乎我必须在MyStruct中创建一个空析构函数,并在cpp文件中定义它,而不是使用默认值来编译它,因为类型不完整。就像这样回答:@drescherjm是的,你知道~unique_ptr将调用任何模板类型的析构函数。如果你允许生成默认的析构函数,它就看不到~MyPrivateStruct的定义,因为它只是在那一点上被向前声明的。是的,这是痛苦的一部分。如果改用shared_ptr,你就不会有这个问题,但我不建议仅仅因为这个原因而使用它。尽管对于我来说,在Visual Studio中,我似乎必须在MyStruct中创建一个空的析构函数,并在cpp文件中定义它,而不是使用默认值来编译它,因为类型不完整。就像这样回答:@drescherjm是的,你知道~unique_ptr将调用任何模板类型的析构函数。如果你允许生成默认的析构函数,它就看不到~MyPrivateStruct的定义,因为它只是在那一点上被向前声明的。是的,这是痛苦的一部分。如果您使用shared_ptr,您就不会有这个问题,但我不建议仅仅因为这个原因就使用它。错。C++标准不坚持它。哦,哇,我不知道。也许我不应该把我的知识仅仅建立在我的微软工具链上。非常感谢,@FitzwilliamBennet Darcy VC++在错误的情况下不符合标准。C++标准不坚持它。哦,哇,我不知道。也许我不应该把我的知识仅仅建立在我的微软工具链上。非常感谢,@FitzwilliamBennet Darcy VC++不符合标准
struct MyPrivateStruct;

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