首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何解决C++命名空间与全局函数之间的名称冲突?

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

Stack Overflow用户
提问于 2010-10-06 10:17:24
回答 4查看 16.4K关注 0票数 12

如果我在某个地方定义了一个名称空间log,并使它在全局范围内可访问,这将与标准cmath头中的double log(double)冲突。实际上,大多数编译器似乎都赞同它--大多数版本的SunCC、MSVC、GCC --但GCC 4.1.2却不这么做。

不幸的是,似乎无法解决歧义,因为using声明对于命名空间标识符来说是不合法的。您知道有什么方法可以在全局命名空间中编写log::Log,即使包括cmath吗?

谢谢。

编辑:有人知道C++03标准对此有什么看法吗?在下面的代码示例中,我认为作用域运算符充分地消除了log使用的歧义。

代码语言:javascript
运行
复制
#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'
EN

回答 4

Stack Overflow用户

发布于 2010-10-06 10:28:06

我建议:

代码语言:javascript
运行
复制
foo::log::Log x; // Your logging class
::log(0.0); // Log function

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

见以下相关问题:

如何在C++中正确地使用名称空间?

票数 13
EN

Stack Overflow用户

发布于 2010-10-06 10:37:18

虽然这对你没有帮助,但GCC 4.1.2的错误是不正确的。log in log::Log只能引用类或命名空间名称。

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

  1. 使用完全限定名foo::log::Log
  2. 使用命名空间别名:
代码语言:javascript
运行
复制
    namespace log1 = foo::log;
    log1::Log logger;
票数 9
EN

Stack Overflow用户

发布于 2015-05-06 03:17:04

cmath出于某种原因使用::log从全局范围获取它,并且无法在函数和名称空间之间作出决定。

命名空间保留代码以防止函数签名的混乱污染

这里是一个完整的、有文档记录的适配 命名空间使用演示:

代码语言:javascript
运行
复制
#include <iostream>
#include <cmath>  // Uses ::log, which would be the log() here if it were not in a namespace, see https://stackoverflow.com/questions/11892976/why-is-my-log-in-the-std-namespace

// Silently overrides std::log
//double log(double d) { return 420; }

namespace uniquename {
    using namespace std;  // So we don't have to waste space on std:: when not needed.

    double log(double d) {
        return 42;
    }

    int main() {
        cout << "Our log: " << log(4.2) << endl;
        cout << "Standard log: " << std::log(4.2);
        return 0;
    }
}

// Global wrapper for our contained code.
int main() {
    return uniquename::main();
}

输出:

代码语言:javascript
运行
复制
Our log: 42
Standard log: 1.43508
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3871474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档