使用std :: qualifier修复奇怪的编译器错误

时间:2017-02-17 13:26:17

标签: c++ c++11 g++ std

我正在尝试构建由其他人编写的开源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以及this answer有关的类似问题。

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

  

error: expected unqualified-id before '(' token

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

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

1 个答案:

答案 0 :(得分:4)

#include <cmath>添加到正在编译的文件中。问题是在标头std::abs中声明的整数类型有两个<cstdlib>重载,编译器抱怨它不知道使用哪些。但是,我需要的是std::abs(double),并在<cmath>中声明了这一点。

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