VC ++ 2012和Boost不兼容 - 库头中的`throw()`规范

时间:2012-10-06 21:45:56

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

我有一个新项目,我不能使用boost :: format。我得到一个编译错误抱怨boost的覆盖虚函数~basic_altstringbuf缺少“throw()”。即使是使用boost :: format的最微不足道的尝试也是如此。

我有其他项目可以正常工作。我已经验证新项目使用相同的include-paths进行boost,对于VC ++包含。所有项目都将“启用C ++异常”设置为“是”。我能想到的唯一解释是,有效的项目有一些#DEFINE或一些禁用std :: include-files中的恶意异常规范的设置。但我不知道它可能是什么或在哪里。有什么想法吗?

  

错误1错误C2694:'boost :: io :: basic_altstringbuf :: ~basic_altstringbuf(void)':覆盖虚函数的限制性异常规范比基类虚拟成员函数'std :: basic_streambuf< _Elem,_Traits>: :~basic_streambuf(void)throw()

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:0)

检查预处理器定义。

您可以打开并检查详细日志记录,以查看传递给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