【问题标题】:Conflict between math.h and cmath?math.h 和 cmath 之间的冲突?
【发布时间】:2012-09-15 10:07:24
【问题描述】:

由于“歧义”,我无法编译。 我有:

#include <cmath>
#include <math.h>

float q;
setActivacion(1/(1+pow(M_E,-q)));

编译器说: ISO C++ 说这些是模棱两可的,即使第一个的最差转换比第二个的最差转换要好:

双pow(双倍,双倍) 浮动标准::pow(浮动,浮动)

我尝试将直接十进制值插入到 pow() 的参数中,它可以工作。只是似乎很难接受一个变量。

提前致谢。

【问题讨论】:

  • cmath 是 c++ 的 math.h 的包装,你不需要两者

标签: c++


【解决方案1】:

这是因为 C++ 标准库合并了 C 标准库 - math.h 和 cmath 应该是相同的,除了 cmath 将所有内容放在 std:: 命名空间中。所以不要同时包含它们——如果你使用的是 C++,你可能应该#include &lt;cmath&gt;only

【讨论】:

  • 我通常会添加&lt;math.h&gt;,因为&lt;cmath&gt; 的大多数实现只在std 命名空间中包含&lt;math.h&gt;using 函数。
  • @Naszta 但这是由实现来完成的,因为它是由实现定义的它是如何实现的(是的,我喜欢这个词!)你的错误是一个典型的错误 eaxctly this(即依赖于实现定义的行为)会破坏您的代码。
  • 基本上我只对&lt;math.h&gt;使用这种做法。这样我也不应该关心std 命名空间。 (已添加 +1。)
【解决方案2】:

错误消息告诉您应该传入两个浮点数或两个双精度数。你传入一个双精度和一个浮点数。

试试pow(M_E, static_cast&lt;double&gt;(-q))

对于它的价值,我无法从 g++ (4.5.3) 中得到这个错误。即使我只包含两个标题之一(并且不管哪个),我也会从 Comeau 中得到类似的错误。

gcc 的实现可能有一些细节,这意味着pow 只有一个匹配的版本。并且可能是在您的编译器上,仅包括一个标头或为 pow 指定命名空间也消除了歧义。但是,依靠依赖于实施细节的修复通常不是一个好主意。

【讨论】:

    【解决方案3】:

    你可能在某个地方有一个using namespace std;,不是吗?您还可以指定您想要的版本,即using std::powusing ::pow(语法来自记忆,但希望您能明白)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-23
      • 2012-06-27
      • 2012-03-06
      • 2011-05-02
      • 2012-11-25
      • 2013-10-27
      • 2014-03-02
      • 2016-11-15
      相关资源
      最近更新 更多