【问题标题】:VC++ 2012 and Boost incompatibility - `throw()` specifications in library headersVC++ 2012 和 Boost 不兼容 - 库头文件中的“throw()”规范
【发布时间】:2012-10-06 21:45:56
【问题描述】:

我有一个无法使用 boost::format 的新项目。我收到一个编译器错误,抱怨 boost 对虚函数 ~basic_altstringbuf 的覆盖缺少“throw()”。即使是最简单的使用 boost::format 的尝试也是如此。

我还有其他项目运行良好。我已经验证新项目使用相同的包含路径进行 boost 和 VC++ 包含。所有项目都将“启用 C++ 异常”设置为“是”。我能想到的唯一解释是,工作的项目有一些#DEFINE 或一些设置,这些设置会禁用 std:: 包含文件中的那些恶意异常规范。但我不知道它可能是什么或在哪里。有什么想法吗?

错误 1 ​​错误 C2694: 'boost::io::basic_altstringbuf::~basic_altstringbuf(void)': 重写虚函数的异常规范比基类虚成员函数 'std::basic_streambuf<_elem> 的限制更少: :~basic_streambuf(void) throw()

编辑:推论问题:VS++ 2012 中是否有一个 Properties-item 会导致 std:: 头文件被包含在没有异常规范的情况下? - 没有关闭异常,是吗?

【问题讨论】:

  • 什么版本的Boost?试试最新版本?如果是最新版本,请在 boost Trac 问题跟踪器中提交错误,因为 VC++ 2012 的编译器检测显然失败
  • @sehe Boost 版本 boost-1.51。它不会在另一个使用相同编译器的项目中失败。两者都使用 v110。我对两者都使用了相同的 boost 包含文件,但作为一个测试,我尝试使用我在本地编译的 boost 中的第一个包含文件和我从网络上预先构建的第二个包含文件。两者都一样。适用于其他项目,不适用于新项目。新的肯定有所不同,但我不知道那可能是什么。

标签: visual-c++ exception boost boost-format


【解决方案1】:

应绿色复选标记原所有者的要求,我提交此摘要。

  1. 错误出现在 Microsoft 方面,在 C++ 标准库接口的头文件中,以及在未设置“禁用语言扩展”时的 VC++ 编译器中。头文件包含标准不要求的异常规范。未启用“语言扩展”时,编译器接受无效代码。我已经提交了bug report.

  2. Boost 可以通过在嵌套包含文件中添加七个字符来解决此特定情况下的问题,即 alt_sstream_impl.hpp 中第 65 行的“throw()”。我也用 boost 提交了a report,尽管我明确表示该错误不在他们的代码中。我只是建议一种解决方法。

所有繁琐的细节都在上面链接的两个报告中。

【讨论】:

  • 感谢您努力发布有效的答案。我希望你喜欢我改变的标题:)
【解决方案2】:

检查预处理器定义。

您可以打开并检查详细日志记录,以查看传递给 cl.exe 的确切标志

您可以保留预处理的源代码,并将旧(工作)项目的版本与新(失败)项目的版本进行比较。

我的直觉说,在旧项目中使用 -D #定义/传递了其他东西,而新项目中没有定义,不同的是(想想WINVER 类型宏)


查看发布的新答案:VC++ 2012 and Boost incompatibility - `throw()` specifications in library headers

由 OP 编辑​​,Jive Dadson - 结果是 /Za,它启用/禁用“Microsoft 语言扩展”。 Visual Studio 的论点是 C++ 标准要求如果程序在“throw()”类别中的虚拟函数覆盖比它覆盖的函数的限制更小,则程序不得编译。 Boost 有一个派生自 basic_streambuf 的类,并且有一个缺少“throw()”的虚拟析构函数。原来的破坏者有那个邪恶的花环。如果我打开 MS 语言扩展,我的新项目将编译 boost::format。

所以问题就变成了,谁错了,怎么错了?将 throw() 放在该析构函数上是否符合标准?所需的行为(即我想要的)实际上是“扩展”吗?我似乎记得 MS 认为某些标准 C++11 功能是“扩展”,但我不确定我是否记得正确。无论如何,如果他们有兴趣,我会让助推器决定。 https://svn.boost.org/trac/boost/ticket/7477

【讨论】:

  • 我已经通过命令行了。我用谷歌搜索了一堆我不熟悉的标志,但我没有看到任何看起来可能是罪魁祸首的东西。那好吧。穿越迷雾!
  • 异常规范肯定需要在覆盖中匹配,even for destructors
  • @James 那么无论是 MS 还是 boost 在其头文件中都有错误。标准是否说 ~basic_streambuf() 应该用 throw() 装饰?最后,这种可憎的行为已被弃用。
  • @James 我找到了它。该错误位于 VC++ 头文件中。 ~basic_streambuf() 的声明没有“throw()”异常说明符。第 27.6.3 节,C++11;第 27.5.1 节 C++03.
  • @JiveDadson 很好的信息。我不再完全确定它是 /Za 标志,还是标题,还是它们的组合?也许您可以将摘要发布为您自己的答案以供将来参考(并接受它)。更多的人可能会遇到这种情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多