5

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

“‘sizeof’对不完整类型‘_TTF_Font’的无效应用”

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

编辑:

TTF_Font被声明为

typedef struct _TTF_Font TTF_Font;

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

我对TTF_Font的使用只是构造一个新的堆栈分配的 shared_ptr 实例,并带有一个指向TTF_Font的原始指针:

auto font_sp = std::shared_ptr<TTF_Font>(font_p);

我在这里没有明确使用sizeof 。

4

1 回答 1

7

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

typedef struct _TTF_Font TTF_Font;
std::shared_ptr<TTF_Font> makeFont();

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

关于您的编辑:

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

于 2013-07-15T08:46:06.500 回答