Como resolver uma colisão de nomes entre um espaço para nome C ++ e uma função global?
se eu definir um espaço para nomelog
em algum lugar e torná-lo acessível no escopo global, isso colidirá comdouble log(double)
do padrãocmath
cabeçalho. Na verdade, a maioria dos compiladores parece concordar com ele - a maioria das versões do SunCC, MSVC, GCC -, mas o GCC 4.1.2 não.
Infelizmente, parece não haver maneira de resolver a ambiguidade, poisusing
declarações não são legais para identificadores de namespace. Você sabe como eu poderia escreverlog::Log
no espaço para nome global, mesmo quecmath
está incluído?
Obrigado.
EDITAR: Alguém sabe o que o padrão C ++ 03 tem a dizer sobre isso? Eu teria pensado que o operador do escopo desambigua suficientemente o uso delog
no exemplo de código abaixo.
#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'