2017-02-17 7 views
1

誰かが書いたオープンソースのC++ライブラリのソースファイルをビルドしようとしています。これはWindows上でCygwin's mingw-w64 compilerで行われています。ライブラリはいくつかのC++ 11の機能に依存しているので、私が付けている唯一のコンパイラオプションは-std=gnu++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);ライン上でコンパイルエラーが、私はそれが同様のSOの質問にquestion of whether std::abs(0u) is ill-formedなどthis answerに関連している可能性が考えさせられました

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

です。

m_isnan = (std::isnan(m_value)) ? true : false;と次の行は、コンパイラが文句はありませんstd::の無数の他の用途がありますが、私に

error: expected unqualified-id before '(' token

を与えます。私にエラーを出すステートメントのstd::修飾子をすべて削除すると、コードは美しくコンパイルされます。

これは、このopen source projectは変更されないで他人によって(おそらく)建設されているので、私はここで何が分からないのですか?

+0

グローバルスコープに 'using namespace std;'がある場合は、それを削除してエラーをすべて解決するか、ライブラリを削除して他のものを削除してください。もっと読む:http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice – NathanOliver

+2

@NathanOliver - 'namespace std;を使用している間、良いアドバイスですが、この問題を解決してください –

+0

コードに ''は含まれていないと推測されます。これは 'std ::'バージョンを使用するための*正式な要件です。とにかくいくつかのコンパイラで見えるかもしれません。 –

答えて

4

#include <cmath>をコンパイルするファイルに追加します。問題は、ヘッダー<cstdlib>で宣言されている整数型の場合、std::absの過負荷がいくつかあり、コンパイラはそれらのどれを使用するのかわからないと訴えているということです。しかし、必要なのはstd::abs(double)であり、それは<cmath>で宣言されています。

このコードがいくつかのコンパイラで動作する理由は、おそらく<cmath>以外のヘッダからのstd::abs(double)という宣言があるからです。それは許されますが、必須ではありません。

+0

これは動作します。私はライブラリファイルの変更を避けることを望んでいたので、それ以降のバージョンにアップグレードする際にこれらの変更について心配する必要はありません – NanoWizard

関連する問題