Visual c++ VC++;2012和Boost不兼容-库标题中的'throw()`规范

Visual c++ VC++;2012和Boost不兼容-库标题中的'throw()`规范,visual-c++,exception,boost,boost-format,Visual C++,Exception,Boost,Boost Format,我有一个新项目,无法使用boost::format。我收到一个编译器错误,抱怨boost对虚拟函数~basic_altstringbuf的重写缺少一个“throw()”。即使是最简单的使用boost::format的尝试也能做到这一点 我有其他项目,它的工作很好。我已经验证了新项目对boost和VC++include使用了相同的include路径。所有项目都有“启用C++异常”设置为“是”。我能给出的唯一解释是,工作的项目有一些#DEFINE或一些设置,这些设置禁用了std::include文件

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

我有其他项目,它的工作很好。我已经验证了新项目对boost和VC++include使用了相同的include路径。所有项目都有“启用C++异常”设置为“是”。我能给出的唯一解释是,工作的项目有一些#DEFINE或一些设置,这些设置禁用了std::include文件中那些恶劣的异常规范。但我不知道它可能在什么地方。有什么想法吗

错误1错误C2694:'boost::io::basic_altstringbuf::~basic_altstringbuf(void)':重写虚拟函数的限制性异常规范小于基类虚拟成员函数'std::basic_streambuf::~basic_streambuf(void)throw()


编辑:推论问题:在VS++2012中是否有一个属性项会导致std::头文件在没有异常规范的情况下被包含除了关闭异常,即检查预处理器定义

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

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

我的直觉告诉我,在旧项目中使用-D定义/传递的东西与在新项目中没有定义的东西不同(想想
WINVER
type宏)


见张贴的新答案: 由OP编辑,JaveDaDuns-它是/ZA,它启用/禁用“微软语言扩展”。这是VisualStudio的竞争,即C++标准要求程序不编译,如果它具有一个虚拟函数重写,那么它在“抛出”类中的限制比它所覆盖的函数少。Boost有一个从basic_streambuf派生的类,还有一个缺少“throw()”的虚拟析构函数。原来的破坏者有那个邪恶的花环。如果打开MS语言扩展,我的新项目将编译boost::format

所以问题变成了,谁错了,怎么错?在析构函数上加上throw()是否符合标准?所期望的行为(即我所期望的)实际上是“扩展”吗?我似乎记得微软曾将一些标准的C++11特性视为“扩展”,但我不确定我记得是否正确。无论如何,如果支持者感兴趣,我会让他们来决定。

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

> P>微软上的bug,在C++标准库接口的头文件中,以及在VC++编译器中没有设置“禁用语言扩展”时。头文件包含标准不要求的异常规范。如果未启用“语言扩展”,编译器将接受无效代码。我已经提交了一份申请

  • Boost可以通过在嵌套的include文件中添加七个字符来解决这个问题,即alt_sstream_impl.hpp中第65行的“throw()”。我也向boost提交了文件,尽管我已经明确表示bug不在他们的代码中。我只是建议一个变通办法


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

    什么版本的Boost?试试最新版本?如果是最新版本,请在boost Trac问题跟踪器中提交一个bug,因为VC++的编译器检测显然失败2012@seheBoost版本Boost-1.51。它不会在使用相同编译器的另一个项目中失败。两者都使用v110。我对两者都使用相同的boostinclude文件,但作为一个测试,我试着首先使用我在本地编译的boost中的include文件,然后使用我在网上预先构建的boost中的include文件。两者都是一样的。适用于其他项目,而不是新项目。新版本一定有点不同,但我不知道会是什么样子。我已经看过命令行了。我用谷歌搜索了一堆我不熟悉的旗帜,但我没有看到任何看起来可能是罪魁祸首的东西。哦,好吧。在雾中前进!异常规范在覆盖中必须匹配。@James那么MS或boost的头文件中都有错误。标准是否规定~basic_streambuf()应该用throw()装饰?“那个可憎的东西终于被弃用了。”詹姆斯我找到了它。错误在VC++头文件中。~basic_streambuf()的声明没有“throw()”异常说明符。第27.6.3节,C++11;第27.5.1节C++03.@JiveDadson大量信息。我不再完全确定它是/Za标志,还是标题,还是它们的组合?也许你可以把总结作为你自己的答案发布,以备将来参考(并接受它)。可能会有更多的人遇到这种情况。感谢您为发布有效答案所做的努力。我希望你喜欢我换的头衔:)