cj.*_*cj. 10 c++ namespaces name-conflict
如果我在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'
Run Code Online (Sandbox Code Playgroud)
Mar*_*ram 11
我建议:
foo::log::Log x; // Your logging class
::log(0.0); // Log function
Run Code Online (Sandbox Code Playgroud)
通常我不会写,using namespace foo;因为foo如果您不打算使用它并且它污染全局命名空间,那么在命名空间中没有任何意义.
请参阅此相关问题:
如何在C++中正确使用名称空间?
虽然它没有帮助你,但GCC 4.1.2的错误是不正确的.该log中log::Log只能引用一个类或命名空间名称.
如果您的代码还需要使用GCC 4.1.2进行编译,那么有两个选项:
foo::log::Log
namespace log1 = foo::log;
log1::Log logger;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11892 次 |
| 最近记录: |