我正在尝试构建由其他人编写的开源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(大概)是由其他人修改的,所以我在这里缺少什么?
答案 0 :(得分:4)
将#include <cmath>
添加到正在编译的文件中。问题是在标头std::abs
中声明的整数类型有两个<cstdlib>
重载,编译器抱怨它不知道使用哪些。但是,我需要的是std::abs(double)
,并在<cmath>
中声明了这一点。
此代码适用于某些编译器而非其他编译器的原因可能是std::abs(double)
声明<cmath>
来自{{1}}以外的某些标头。这是允许的,但不是必需的。