gpt4 book ai didi

c++ - GotW #101 "solution"真的能解决什么问题吗?

转载 作者:IT老高 更新时间:2023-10-28 21:47:49 36 4
gpt4 key购买 nike

首先阅读 Herb 的 Sutters GotW 关于 C++11 中的 pimpl 的帖子:

我在理解 GotW #101 中提出的解决方案时遇到了一些问题。据我所知,在 GotW #100 中辛苦解决的所有问题都卷土重来:

  • pimpl成员是离线模板,并且定义在使用时不可见(在 class widget 的类定义和隐式生成的 widget 的特殊成员函数中)。也没有任何明确的实例化。这将在链接期间导致 Unresolved external 错误。

  • widget::implpimpl<widget::impl>::~pimpl() 处仍然不完整是 instantiated 定义的(我认为它实际上根本没有被实例化,只是被引用)。所以std::unique_ptr<widget::impl>::~unique_ptr()来电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() 的链接器错误和 pimpl<widget::impl>::~pimpl() .当我添加 template class pimpl<widget::impl>; ,链接正常。

换句话说,GotW #101 消除了 GotW #100 中的所有样板,但您需要添加 pimpl<...> 的显式实例化带有 pimpl 实现的模板暗示。至少对于 #101,您需要的样板代码很简单。

关于c++ - GotW #101 "solution"真的能解决什么问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8595471/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com