我的问题很简单:我使用SDL创建一个简单的模拟,我想在智能指针(shared_ptr)中存储TTF_Font类型的实例,但我不断收到此错误:
“将'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 。
答案 0 :(得分:5)
通常使用shared_ptr
不完整类型应该有效。你可以声明一个这样的函数
typedef struct _TTF_Font TTF_Font;
std::shared_ptr<TTF_Font> makeFont();
在头文件中没有问题。 makeFont()
的实现需要查看类TTF_Font
的完整定义。因此,在实现文件中,您需要包含定义TTF_Font
类的文件。如果要隐藏此实现细节,可以考虑将makeFont()
放入包含在项目中的库中。这样,您的项目不需要包含定义TTF_Font
的头文件,除非您出于其他原因想要访问此类的成员。
关于您的修改:
当您从指针创建shared_ptr
时,shared_ptr
将在内部存储如何删除该对象。为此,shared_ptr
需要查看指向的类型的析构函数。因此,即使没有调用构造函数,shared_ptr
也需要查看结构定义。