Si je définis quelque part un espace de noms log
et le rend accessible dans la portée globale, cela se heurtera à double log(double)
à partir de l'en-tête standard cmath
. En fait, la plupart des compilateurs semblent y adhérer - la plupart des versions de SunCC, MSVC, GCC - mais pas GCC 4.1.2.Comment résoudre une collision de noms entre un espace de noms C++ et une fonction globale?
Malheureusement, il n'y a aucun moyen de résoudre l'ambiguïté, car les déclarations using
ne sont pas légales pour les identificateurs d'espaces de noms. Savez-vous comment je pourrais écrire log::Log
dans l'espace de noms global même si cmath
est inclus?
Merci.
EDIT: Quelqu'un sait-il ce que la norme C++ 03 a à dire à ce sujet? J'aurais pensé que l'opérateur de portée désambiguïsait suffisamment l'utilisation de log
dans l'exemple de code ci-dessous.
#include <cmath>
namespace foo
{
namespace log
{
struct Log { };
} // namespace log
} // namespace foo
using namespace foo;
int main()
{
log::Log x;
return 0;
}
// g++ (GCC) 4.1.2 20070115 (SUSE Linux)
// log.cpp: In function `int main()':
// log.cpp:20: error: reference to `log' is ambiguous
// /usr/include/bits/mathcalls.h:110: error: candidates are: double log(double)
// log.cpp:7: error: namespace foo::log { }
// log.cpp:20: error: expected `;' before `x'
Pourquoi ne pas simplement écrire comme' foo :: log :: log' pour empêcher la ambiguousity ? –
'Log' n'est pas le seul membre de' foo :: log', il y en a beaucoup. Mais oui, je finirai probablement par qualifier complètement tout cela s'il n'y a pas d'autre moyen. –
@cj: Vous voudrez peut-être jeter un oeil à [cette réponse] (http://stackoverflow.com/questions/2879555/c-stl-how-to-write-wrappers-for-cout-cerr-cin-and -endl/2880136 # 2880136). – sbi