【发布时间】:2018-03-13 23:29:54
【问题描述】:
我正在尝试使用 C++ 中的 unique_ptr 来指向一个结构。初始化器不知道结构的定义。包含结构的头文件包含一个检索结构大小的函数,该结构通过create(void* memory) 调用构造并返回,其中memory 指向适当大小的数据块。
使用以下示例代码初始化此 unique_ptr(修复此错误后将添加 malloc 成功检查),导致编译时错误:error: invalid application of ‘sizeof’ to incomplete type ‘OlmAccount’,因为代码无法访问结构定义。
是否可以将结构的大小指定为唯一指针,从而有效地“覆盖”该结构的 sizeof 并解决此错误?
导致此问题的示例:
std::unique_ptr<OlmAccount>(static_cast<OlmAccount *>(olm_account(malloc(olm_account_size()))));
编辑: 类似的问题与指定删除器有关,并通过指定删除器来解决。但是,当这段代码适应使用 shared_ptr(它被定义为使用不完整的删除器正确编译)时,会抛出相同类型的大小错误:
error: invalid application of ‘sizeof’ to incomplete type ‘OlmAccount’
static_assert( sizeof(_Yp) > 0, "incomplete type" );
【问题讨论】:
-
您需要为
OlmAccount提供自定义删除器,并在所有unique_ptrs 到OlmAccount中使用此删除器。由于这看起来可能是 C 结构的 C++ 接口,因此您可能有一个_destroy或_free在这种情况下可以轻松使用。 -
感谢您的建议。我已经更新了我的问题(在编辑部分下)以解决删除器可能存在的问题。