如何解决C++命名空间和全局函数之间的名称冲突?

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++中正确使用名称空间?


Bar*_*nau 7

虽然它没有帮助你,但GCC 4.1.2的错误是不正确的.该loglog::Log只能引用一个类或命名空间名称.

如果您的代码还需要使用GCC 4.1.2进行编译,那么有两个选项:

  1. 使用完全限定名称 foo::log::Log
  2. 使用命名空间别名:

    namespace log1 = foo::log;
    log1::Log logger;
Run Code Online (Sandbox Code Playgroud)