gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 15:45:59 26 4
gpt4 key购买 nike

如果我在某处定义一个命名空间 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'

最佳答案

我建议:

foo::log::Log x; // Your logging class
::log(0.0); // Log function

通常我不会写 using namespace foo; 因为如果你不打算使用它并且它会污染,那么将它放在 foo 命名空间中是没有意义的全局命名空间。

参见这个相关问题:
How do you properly use namespaces in C++?

关于c++ - 如何解决 C++ 命名空间和全局函数之间的名称冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3871474/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com