【问题标题】:Missing templates from `<cmath>` header in VS 2010VS 2010 中的 `<cmath>` 标头中缺少模板
【发布时间】:2012-02-27 23:10:53
【问题描述】:

我刚刚注意到由 c++11 标准 [26.8 c.math]&lt;cmath&gt; 标头指定的模板在 Visual Studio 附带的 c++ 标准库版本中缺失2010 年。

特别是我一直在寻找 std::signbit 但search on msdn 证实了我在随附的标头中看到的内容(即,一系列仅导入“旧”C 名称的 using 指令)。 我不记得阅读过这种与标准的偏差,也没有在 msdn 文档中明确指出。

获得缺失功能的最佳解决方法是什么?

在 Visual Studio 的未来版本中是否有一些关于修复此问题的官方沟通?

编辑 我所指的标准版本已经过时,所以我声称不完整的说法是错误的。仍然缺少符号位,但它不是模板,而是重载函数。感谢@Xeo 的澄清。

【问题讨论】:

    标签: c++ visual-studio c++11 standards-compliance cmath


    【解决方案1】:

    首先,these aren't templates(会很奇怪,因为 C 中没有模板,而 &lt;cmath&gt; 是 C 标头)。

    然后,VS2010 是在 C++11 完成之前发布的,所以没有包含所有 stdlib 是可以理解的。

    FWIW,VS11 声称涵盖了整个 C++11 标准库。

    【讨论】:

    • 关于 VS11 的好消息。但请注意,标准称它们为模板,cmath 知道命名空间(这不是很像 C)。 signbit 的签名是 namespace std { template bool signbit(T x); }.
    • @Francesco:我不知道你有哪个标准论文,但在 FDIS 中,std::signbit 直接取自 C 标准库,它定义了三个重载 (26.8/10)。此外,命名空间是&lt;cheader&gt;s 的点。 :)
    • 我指的是最终草案 n3092,第 970 页。第 11 点说“在 cmath 中定义的模板替换了具有相同名称的 C 宏。模板具有以下声明:...”。第 12 点说:“模板的行为与具有相应名称的 C 宏相同”。查看 mingw 源或在线 g++ 源可确认它们是函数模板(加上常用类型的重载)。参见例如gcc.gnu.org/viewcvs/trunk/libstdc%2B%2B-v3/include/c_global/…
    • 这些额外的重载可能是也可能不是模板。
    • "FWIW,VS11 声称涵盖了整个 C++11 标准库。" 引用 this blog post: "此外,VC11 不会完全实现C99 标准库”。所以,不要期望在 VC11 中看到std::signbit
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-12
    • 2011-09-26
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    相关资源
    最近更新 更多