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

问题描述:

我试图构建由其他人编写的开源C++库的源文件。这是在Windows上使用Cygwin's mingw-w64 compiler完成的。我附加的唯一编译器选项是-std=gnu++11,因为该库取决于某些C++ 11功能。用std :: qualifier修复奇怪的编译器错误

这里是他们的库代码出现一些例子是造成问题:

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了类似SO问题。

m_isnan = (std::isnan(m_value)) ? true : false;和下面的行给我

error: expected unqualified-id before '(' token

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

事情是,这open source project(大概)是由别人修改而没有修改,所以我在这里错过了什么?

+0

如果在全局范围内有'using namespace std;',那么删除它并修复所有的错误,或者直接删除这个库并罚款其他的东西。更多阅读:http://*.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice – NathanOliver

+2

@NathanOliver - 同时删除'使用名称空间标准;'是好建议,它赢得' t解决了这个问题 –

+0

有人猜测代码中不包含'',这是使用'std ::'版本的*形式*要求。有了一些编译器,无论如何它们都可以看到。 –

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

,这个代码与某些编译器,而不是其他可能存在的std::abs(double)从比<cmath>其他一些头即将在声明的原因。这是允许的,但不是必需的。

+0

这工作。我希望避免修改任何库文件,以便在升级到更高版本时不必担心这些修改 – NanoWizard