shared_ptr与库中的不完整类型

Paw*_*tyl 3 c++ sdl shared-ptr

我的问题很简单:我使用SDL创建一个简单的模拟,我想在智能指针(shared_ptr)中存储TTF_Font类型的实例,但我不断收到此错误:

"将'sizeof'无效应用于不完整类型'_TTF_Font'"

有没有办法使用外部库中不完整类型的智能指针而不将其源代码合并到我的程序中?

编辑:

TTF_Font声明为

typedef struct _TTF_Font TTF_Font;
Run Code Online (Sandbox Code Playgroud)

_TTF_Font又在编译的外部库中定义.

我对TTF_Font的使用只是构建一个新的堆栈分配的shared_ptr实例和一个指向TTF_Font的原始指针:

auto font_sp = std::shared_ptr<TTF_Font>(font_p);
Run Code Online (Sandbox Code Playgroud)

我这里没有明确使用sizeof.

Ral*_*zky 6

通常有一个shared_ptr不完整的类型应该工作.你可以声明这样的函数

typedef struct _TTF_Font TTF_Font;
std::shared_ptr<TTF_Font> makeFont();
Run Code Online (Sandbox Code Playgroud)

在头文件中没有问题.实现makeFont()将需要看到该类的完整定义TTF_Font.因此,在实现文件中,您需要包含定义TTF_Font类的文件.如果要隐藏此实现细节,可以考虑将其放入makeFont()包含在项目中的库中.这样,您的项目不需要包含定义的头文件,TTF_Font除非您出于其他原因想要访问此类的成员.

关于你的编辑:

当您shared_ptr从指针创建一个指针时,shared_ptr将在内部存储如何删除该对象.为此,shared_ptr需要查看指向类型的析构函数.因此,shared_ptr即使没有调用构造函数,也需要查看结构定义.