gpt4 book ai didi

c++ - 使用命名空间不适用于定义?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:29:46 25 4
gpt4 key购买 nike

我无法理解 C++ 命名空间。考虑以下示例:

//distr.h

namespace bogus{
extern const int x;
extern const int y;
double made_up_distr(unsigned param);
}

现在,如果我像下面的 cpp 那样定义我的变量,一切都可以正常编译

//distr.cpp

#include "distr.h"
#include <cmath>

const int bogus::x = 10;
const int bogus::y = 100;

double bogus::made_up_distr(unsigned param){
auto pdf = (exp(param) / bogus::x) + bogus::y;
return pdf;
}

但是如果我尝试简单地引入 bogus 命名空间并改为使用

//broken distr.cpp

#include "distr.h"
#include <cmath>

using namespace bogus;

const int x = 10;
const int y = 100;

double made_up_distr(unsigned param){
auto pdf = (exp(param) / x) + y;
return pdf;
}

我的编译器告诉我对 xy 的引用不明确。这是为什么?

最佳答案

为什么这不能按您预期的方式合理地工作,原因很简单:

namespace bogus {
const int x;
}
namespace heinous {
const int x;
}

using namespace bogus;
using namespace heinous;

const int x = 10;

现在,上面的 x 应该引用 bogus::xheinous::x 还是一个新的全局 ::x ?这将是第三个没有 using 语句的情况,这意味着在这里添加 using 语句会以一种特别微妙的方式改变现有代码的含义。

using 语句用于引入范围(通常但不一定是命名空间)的内容以供查找。声明

const int x = 10;

一开始通常需要查找,除非检测 ODR 违规。

关于c++ - 使用命名空间不适用于定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17790602/

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