未定义模板的隐式实例化:Boost Bug 还是 Clang Bug?

2023-12-13

我试图编译一些使用 Boost (1.49) 的代码,并使用 trunk 中的 Clang(& libc++) 。 有问题的代码归结为以下内容:

#include <memory>
#include <boost/signals2.hpp>

int main()
{
    std::shared_ptr<int> s;
}

使用 Clang 编译时,会发出以下消息:

$ clang++ -I/home/alexander/usr/local/include --stdlib=libc++ -std=c++0x signals2-bug.cpp   -o signals2-bug
signals2-bug.cpp:6:26: error: implicit instantiation of undefined template
      'std::shared_ptr<int>'
    std::shared_ptr<int> s;
                         ^
/home/alexander/usr/local/include/boost/signals2/detail/foreign_ptr.hpp:24:30: note: 
      template is declared here
  template<typename T> class shared_ptr;
                         ^

boost/signals2/detail/foreign_ptr.hpp 中的违规行是:

#if !defined(BOOST_INTEL_STDCXX0X)
namespace std
{
  template<typename T> class shared_ptr;
  template<typename T> class weak_ptr;
}
#endif

现在该怪谁呢?

我想到两件事:

  1. 为什么 Boost.Signals 标头需要声明自己的共享指针?有什么收获?
  2. Boost.Signals 中的行看起来像一个简单的前向声明。如果它出现在模板定义之后,为什么会出现问题?

EDIT

这似乎是一个 Boost.Signals2 错误,因为根据 ISO/IEC C++ 2011 标准第 17.6.4.2.1 节,std:: 命名空间中的事物声明会导致未定义的行为:

如果 C++ 程序添加声明或 命名空间 std 或命名空间 std 内的命名空间的定义 除非另有规定。程序可以添加模板 专业化 对于任何标准库模板,仅当声明依赖于用户定义类型时才到名称空间 std 并且专业化满足原始模板的标准库要求,并且没有明确 禁止。

Boost bug 跟踪器中的票证已创建:https://svn.boost.org/trac/boost/ticket/6655

请注意,这里也存在一个 Clang bug:http://llvm.org/bugs/show_bug.cgi?id=10521,但是实施者指出存在违规行为。

Google 员工的后续行动:

问题确实是 Boost 的 bug。这变更集 77289应该可以解决 Boost 1.50 的问题。 Clang 中相应的 Bug 被标记为无效。


代码在foreign_ptr.hpp是一个重新声明(如果shared_ptr已经被定义),因此不太可能导致问题(添加声明std从技术上讲是未定义的行为,但大多数编译器并不关心,因为它们并没有真正区分标准库头和其他文件)。所以错误只能由以下原因引起shared_ptr实际上是未定义的。

Now libc++显然有一个定义shared_ptr,所以我只能怀疑某些 C++03 库以某种方式进入了包含路径,并且比 libc++ 更受青睐。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

未定义模板的隐式实例化:Boost Bug 还是 Clang Bug? 的相关文章

随机推荐

  • 使用 angular2 从服务更新组件中的变量更改

    我的应用程序有一个保存名称的 NameService App 有两个子组件 Navbar 和 TheContent 引用此服务 每当服务中的名称发生变化时 我希望它在其他两个组件中进行更新 我怎样才能做到这一点 import Compone
  • 使用 ibatis 检索新插入行的 Id 时出现并发问题

    我正在使用 iBatis Java 和 Postgres 8 3 当我在 ibatis 中进行插入时 我需要返回 id 我使用下表来描述我的问题 CREATE TABLE sometable id serial NOT NULL somef
  • 在何处以及如何将 C++ 代码格式化为小数点后两位

    使用输出语句显示输入数据和计算结果 显示格式化为两位小数的小数值 这就是我遇到困难的地方 对于这个特定的项目 其他所有事情都已完成 因此例如 当您使用 4 4444 作为工资率并使用 10 表示小时数时 它应该打印出正常工资是 44 44
  • 使用自动布局,如何根据图像使 UIImageView 大小动态变化?

    我想要我的UIImageView根据其显示的实际图像的大小来放大或缩小 但我希望它保持垂直居中并且距离超级视图的前缘 10 点 但是 如果我设置这两个约束 它会抱怨我没有设置足够的约束来满足自动布局 对我来说 它似乎完美地描述了我想要的东西
  • 如何集成nodeJS + Socket.IO和PHP?

    我最近一直在四处寻找 寻找一种在nodeJS和PHP之间进行通信的好方法 这个想法是 nodeJS 仍然很新 仅用它来开发完整的应用程序可能有点棘手 此外 您可能只需要项目的一个模块 例如实时通知 聊天 并且您希望使用 PHP 管理所有其他
  • 如何在 UIPopoverController 之上添加视图

    我有一个 iPad 应用程序 其中有一个 抽屉 表显示在弹出窗口中 用户可以点击并按住抽屉中的某个项目 将该项目从抽屉中拖出并拖入我的主视图中 那部分工作正常 不幸的是 被拖动的视图出现在弹出窗口下方 并且太小而无法看到 直到从其下方拖出为
  • Excel VBA:正则表达式 - 获取文件名

    如何获取文件名 没有路径和扩展名 像 我的文件名 来自以下完整路径 C A B C D E F 0123456789 G 文件名 txt Public Function GetFileNameWithoutExt ByVal fullPat
  • Windows 10 Git 推送表示一切都是最新的,但没有进行更改

    我正在使用 MINGW64 将更改推送到远程存储库 当我做出新的更改时 我会添加它并提交 当我推送它时 它说它做了更改 然后我去了 github 但没有进行更改 当我从 Mac 和桌面推送时就会发生这种情况 我还尝试访问该网站并手动执行此操
  • 如何使用 BeautifulSoup 查找 HTML 页面中

    元素内的所有文本

    我需要使用 Python 中的 BeautifulSoup 查找 HTML 文件中段落元素内的所有可见标签 例如 p Many hundreds of named mango a href wiki Cultivar title Culti
  • 如何在 Mac 上的 Python 中使用 CGEventCreateKeyboardEvent?

    我已经安装了 pyobjc 带有 Quartz 我想知道如何使用 CGEventCreateKeyboardEvent 正确创建键盘事件 请 我在互联网上根本找不到它 而且我什至不知道要导入什么 一个示例代码会很好 告诉我要导入什么以及将什
  • JMeter - / 在后续 HTTP 请求中发布时替换为 %2F

    应用程序 ASP NET 正则表达式后处理器捕获的值 VIEWSTATE wEPDwULLTEwMjgyMTI3ODAPZBYCAgEPZBYCAgEPDxYCHgRUZXh0ZWRkZAX cy5B 46umWN01upyRg2q kD
  • 访问 DStream 集合

    我正在尝试访问已过滤的 DStream 的集合 就像在该问题的解决方案中一样 Spark Streaming 基于过滤器参数分割输入流的最佳方法 我按如下方式创建集合 val statuCodes Set 200 500 404 spanT
  • 从图像中裁剪圆形缩略图的最简单方法是什么?

    我正在尝试从此图像中裁剪一个居中 或不居中 的圆 我从有关堆栈溢出主题的现有问题中窃取了这段代码 但出了问题 import cv2 file dog png img cv2 imread file img cv2 cvtColor img
  • 在 WooCommerce 产品搜索中启用自定义分类法

    我想要的是 修改 WooCommerce 搜索表单 在前端 的查询 通过搜索产品的名称 描述和产品标签来显示产品 我拥有的 我正在尝试使用这段代码受到这个答案的启发返回产品名称和描述的结果 但如果我使用标签名称进行搜索 则没有结果 搜索查询
  • 使用递归回溯查找有向图中的所有循环

    我正在研究使用递归回溯在有向图中查找循环 有一个建议的伪代码here 在这里 dfs adj node visited if visited node if node start found a path return visited no
  • Smarty 正则表达式匹配

    我有一个 smarty 变量 我想知道它是否与某些字符串匹配
  • Windows 应用商店应用程序中的 HtmlAgilityPack

    因此 我在控制台应用程序中有一些工作测试代码 我将其转移到 Windows 应用商店应用程序 现在的问题是 我刚刚复制了控制台应用程序中的 HtmlAgilityPack 代码 但现在它不起作用 我确实有 HtmlAgilityPack 作
  • 在 Android API 中调用私有(未发布)方法

    我需要检查当前在 OS 2 0 2 3 中连接了哪些 BT 耳机 不仅仅是配对 此类功能直到 API 版本 11 才出现 其中引入了蓝牙耳机类 但之前的 API 中已经存在一个名为 BluetoothHeadset 的类 但它无法公开访问
  • 如何将 wav 文件填充到特定长度?

    我正在使用波形文件来制作深度学习模型 它们的长度不同 所以我想全部填充 使用 python 达到 16 秒长度 如果我理解正确 问题是将所有长度固定为给定长度 因此 解决方案会略有不同 from pydub import AudioSegm
  • 未定义模板的隐式实例化:Boost Bug 还是 Clang Bug?

    我试图编译一些使用 Boost 1 49 的代码 并使用 trunk 中的 Clang libc 有问题的代码归结为以下内容 include