如果我在某处定义了一个命名空间
不幸的是,似乎没有解决这种歧义的方法,因为
谢谢。
编辑: 请问C++03标准对此有何说明?我原本认为作用域运算符已经足够消除下面代码示例中
log
并使其可在全局范围内访问,则这将与标准cmath
头文件中的double log(double)
冲突。实际上,大多数编译器似乎都可以正常工作 -- 大多数版本的SunCC、MSVC、GCC -- 但是GCC 4.1.2不行。不幸的是,似乎没有解决这种歧义的方法,因为
using
声明对于命名空间标识符是非法的。您是否知道有什么方法可以在包括cmath
的情况下在全局命名空间中写入log::Log
?谢谢。
编辑: 请问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'
<c****>
导入的C标识符不应该位于std
命名空间中吗?这是v4.1实现的错误(在g++ 4.4中,此代码可以正常工作),还是我记错了这件事? - Matteo Italia<name.h>
C头文件时,这些标识符才必须放置在全局命名空间中,而包含<cname>
则应该将它们放置在std
命名空间中。 - Matteo Italia/usr/include/bits/mathcalls.h
,但是文件<cmath>
期望例如log
在全局命名空间中(参见 gcc 的 stdlib<cmath>
的第 356 行,它读取using ::log;
)。我想知道是否可以通过操作所有定义的宏来纠正所有这些行为。顺便说一下,@MatteoItalia,在 gcc 4.7 中也发现了这个问题,所以如果在 4.4 中修复了该 bug,则该 bug 又回来了。 - alfC