0

我有一个无法使用 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,_Traits>::~basic_streambuf (无效)抛出()

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

4

2 回答 2

2

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

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

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

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

于 2012-10-07T21:54:25.663 回答
0

检查预处理器定义。

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

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

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


查看发布的新答案:VC++ 2012 and Boost incompatibility - `throw()` specification 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

于 2012-10-06T23:06:46.260 回答