使用 std:: 限定符修复奇怪的编译器错误

Fixing odd compiler errors with std:: qualifier

我正在尝试构建由其他人编写的开源 C++ 库的源文件。这是在 Windows 和 Cygwin's mingw-w64 compiler 上完成的。我附加的唯一编译器选项是 -std=gnu++11,因为该库依赖于某些 C++11 功能。

以下是他们库中可能导致问题的一些代码示例:

CPScalar & Abs()
{
    m_dValue = std::abs(m_dValue);
    return *this;
}

//...

template<typename Unit>
bool SEScalarQuantity<Unit>::Set(const SEScalarQuantity<Unit>& s)
{
  if (m_readOnly)
    throw CommonDataModelException("Scalar is marked read-only");
  if (!s.IsValid())
    return false;
  m_value = s.m_value;
  m_isnan = (std::isnan(m_value)) ? true : false;
  m_isinf = (std::isinf(m_value)) ? true : false;
  m_unit = s.m_unit;
  return true;
}

我在上面的 std:: 合格函数上遇到编译器错误。 m_dValue = std::abs(m_dValue); 行的编译器错误是

error: call of overloaded 'abs(double&)' is ambiguous

这让我觉得它可能与 question of whether std::abs(0u) is ill-formed as well as 类似的 SO 问题有关。

m_isnan = (std::isnan(m_value)) ? true : false; 下一行给了我

error: expected unqualified-id before '(' token

std:: 还有无数编译器不会抱怨的其他用途。如果我删除了给我错误的语句中的所有 std:: 限定符,代码编译得很好。

事实是,这个 open source project 是(大概)由其他人未经修改构建的,所以我在这里缺少什么?

#include <cmath>添加到正在编译的文件中。问题是 header <cstdlib> 中声明的整数类型有几个 std::abs 重载,编译器抱怨它不知道要使用哪些.不过,我们需要的是 std::abs(double),它已在 <cmath>.

中声明

此代码适用于某些编译器而不适用于其他编译器的原因可能是 std::abs(double) 的声明来自某些 header 而不是 <cmath>。这是允许的,但不是必需的。