我有一个新项目,我不能使用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文件被包含在内而没有异常规范? - 没有关闭异常,那是吗?
答案 0 :(得分:2)
应绿色复选标记的原始所有者的要求,我正在提交此摘要。
错误在Microsoft方面,在C ++标准库接口的头文件中,以及在未设置“禁用语言扩展”时在VC ++编译器中。头文件包含标准不要求的异常规范。如果未启用“语言扩展”,编译器将接受无效代码。我已提交了bug report.
通过在嵌套的包含文件中添加7个字符,即alt_sstream_impl.hpp中第65行的“throw()”,Boost可以解决此特定情况下的问题。我也提出了a report提升,尽管我明确表示该错误不在他们的代码中。我只是建议一个解决方法。
所有繁琐的细节都在上面链接的两份报告中。
答案 1 :(得分:0)
检查预处理器定义。
您可以打开并检查详细日志记录,以查看传递给cl.exe
的确切标记
您可以保留预处理源并将旧(工作)项目的版本与新(失败)项目进行比较。
我的直觉说,在新项目中没有定义的旧项目中使用-D来定义/传递其他东西,不同(想想WINVER
类型宏)
<击> 由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
击>