使用 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>
。这是允许的,但不是必需的。
我正在尝试构建由其他人编写的开源 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
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>
。这是允许的,但不是必需的。