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?
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
@NathanOliver - en supprimant 'using namespace std;' est un bon conseil, il a gagné ' t résoudre ce problème –
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. –