首先阅读 Herb 的 Sutters GotW 帖子,内容涉及 C++11 中的 pimpl:
我在理解 GotW #101 中提出的解决方案时遇到一些困难。据我所知,GotW #100 中费力解决的所有问题都卷土重来:
The pimpl
成员是外线模板,并且定义在使用时不可见(在class widget
的类定义和隐式生成的特殊成员函数widget
)。也没有任何显式实例化。这将导致链接期间出现未解决的外部错误。
widget::impl
在这一点上仍然不完整pimpl<widget::impl>::~pimpl()
已定义实例化(我认为它实际上根本没有实例化,只是引用)。所以std::unique_ptr<widget::impl>::~unique_ptr()
calls delete
在指向不完整类型的指针上,如果出现以下情况,则会产生未定义的行为widget::impl
有一个不平凡的析构函数。
请解释是什么迫使编译器在上下文中生成特殊成员widget::impl
做完了。因为我看不出这是如何运作的。
如果 GotW #101 仍然需要显式定义widget::~widget()
在实现文件中,其中widget::impl
已完成,那么请解释“更稳健”的评论(@sehe 在他的回答中引用了该评论)。
我正在查看 GotW #101 的核心主张,即包装器“消除了一些样板文件”,在我看来(基于该段落的其余部分)这意味着widget::~widget()
声明和定义。所以请不要依赖你的答案,在 GotW #101 中,那已经消失了!
Herb,如果您顺便过来,请告诉我是否可以将解决方案代码剪切+粘贴到此处以供参考。
你是对的;该示例似乎缺少显式模板实例化。当我尝试使用构造函数和析构函数运行示例时widget::impl
在 MSVC 2010 SP1 上,我收到链接器错误pimpl<widget::impl>::pimpl()
and pimpl<widget::impl>::~pimpl()
。当我添加template class pimpl<widget::impl>;
,它链接得很好。
换句话说,GotW #101 消除了 GotW #100 中的所有样板,但您需要添加一个显式实例化pimpl<...>
模板与实施pimpl
暗示。至少对于 #101,您需要的样板很简单。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)