Если я определю пространство имен log
где-нибудь и сделаю его доступным в глобальной области видимости, это будет конфликтовать с double log(double)
из стандартного заголовка cmath
. На самом деле большинство компиляторов, похоже, согласны с этим - большинство версий SunCC, MSVC, GCC - но GCC 4.1.2 - нет.
К сожалению, кажется, нет способа разрешить эту неоднозначность, поскольку объявления using
недопустимы для идентификаторов пространства имен. Знаете ли вы, как я мог бы написать log::Log
в глобальном пространстве имен, даже если включен cmath
?
Спасибо.
РЕДАКТИРОВАТЬ : Кто-нибудь знает, что по этому поводу говорит стандарт C ++ 03? Я бы подумал, что оператор области видимости устраняет неоднозначность использования log
в приведенном ниже примере кода.
#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'