如果我在某个地方定义了一个名称空间log
并使其在全局范围内可访问,则将与标准cmath
标头中的double log(double)
冲突。实际上,大多数编译器似乎都遵循它 - SunCC,MSVC,GCC的大多数版本 - 但GCC 4.1.2不支持。如何解决C++名称空间和全局函数之间的名称冲突?
不幸的是,似乎没有办法解决歧义,因为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'
为什么不只是把它写为'富::登录:: Log'防止ambiguousity ? – 2010-10-06 10:25:13
'Log'不是'foo :: log'的唯一成员,这里有很多。但是,是的,如果没有其他方法,我可能会完全排除所有这些问题。 – 2010-10-06 10:28:35
@cj:你可能想看看[这个答案](http://stackoverflow.com/questions/2879555/c-stl-how-to-write-wrappers-for-cout-cerr-cin-and -endl/2880136#2880136)。 – sbi 2010-10-06 10:34:07