2017-02-17 2 views
1

Je tente de créer des fichiers source d'une bibliothèque C++ open source écrite par quelqu'un d'autre. Ceci est fait sur Windows avec Cygwin's mingw-w64 compiler. La seule option de compilation que j'attache est -std=gnu++11 car la bibliothèque dépend de certaines fonctionnalités C++ 11.Correction d'erreurs de compilation impaires avec le qualificatif std ::

Voici quelques exemples de code dans leur bibliothèque qui semble causer des problèmes:

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; 
} 

Je reçois des erreurs de compilation sur les std:: fonctions qualifiées ci-dessus. L'erreur du compilateur sur la ligne m_dValue = std::abs(m_dValue); est

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

Ce qui me fait penser qu'il pourrait être lié à la question of whether std::abs(0u) is ill-formed ainsi que this answer à une question similaire SO.

m_isnan = (std::isnan(m_value)) ? true : false; et la ligne suivante me donne

error: expected unqualified-id before '(' token

Il existe d'innombrables autres utilisations de std:: que le compilateur ne se plaint pas. Si je supprime tous les qualificatifs std:: dans les instructions qui me donnent des erreurs, le code se compile magnifiquement.

En l'occurrence, ce open source project est (sans doute) construit par d'autres sans modification, alors qu'est-ce qui me manque ici?

+0

S'il y a 'using namespace std;' dans la portée globale, supprimez-le et corrigez toute l'erreur ou supprimez simplement la bibliothèque et affinez une autre chose. More reading: http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice – NathanOliver

+2

@NathanOliver - en supprimant 'using namespace std;' est un bon conseil, il a gagné ' t résoudre ce problème –

+0

On suppose que le code n'inclut pas '', ce qui est l'exigence * formelle * pour utiliser les versions 'std ::'. Avec certains compilateurs, ils peuvent être visibles de toute façon. –

Répondre

4

Ajoutez #include <cmath> au fichier en cours de compilation. Le problème est qu'il y a quelques surcharges de std::abs pour les types entiers qui sont déclarés dans l'en-tête <cstdlib> et le compilateur se plaint de ne pas savoir lequel de ceux à utiliser. Ce qui est nécessaire, cependant, c'est std::abs(double), et cela est déclaré dans <cmath>.

La raison pour laquelle ce code fonctionne avec certains compilateurs et pas d'autres est probablement qu'il y a une déclaration de std::abs(double) provenant d'un en-tête autre que <cmath>. C'est autorisé, mais pas obligatoire.

+0

Cela fonctionne. J'espérais éviter de modifier l'un des fichiers de la bibliothèque, de sorte que je n'ai pas à vous soucier de ces modifications lors de la mise à niveau vers une version ultérieure – NanoWizard