使用命名空间重新定义错误

Dai*_*oci 3 c++ namespaces

// main.cpp
const double MAX = 3.5;

namespace ns
{
   const int MAX = 3;
}

int main()
{
}
Run Code Online (Sandbox Code Playgroud)

这会导致重新定义错误吗?

我指的是这个MSDN页面,它在备注部分说这是一个错误.

更新:我想在复制代码时可能会遗漏一个重要声明.

using ns::MAX;
Run Code Online (Sandbox Code Playgroud)

raz*_*ebe 5

不 - 我不知道该代码将如何导致重新定义错误.

事实上,你可以自己编译并查看.


编辑:现在跟进,你已经提供了你提到的MSDN页面的链接......

该MSDN页面正在讨论using指令上下文中的名称冲突:

如果局部变量与命名空间变量具有相同的名称,则隐藏命名空间变量.具有与全局变量同名的命名空间变量是错误的.

这是一个隐藏命名空间变量的局部变量的示例,该变量已被using指令引入范围:

namespace ns
{
   const int MAX = 3;
}

using namespace ns;

int main()
{
   int MAX = 4; // local
   int test = MAX;   // test is 4, because the local variable is used 
                     // as the namespace variable is hidden
}
Run Code Online (Sandbox Code Playgroud)

包含该using指令会将名称ns空间中声明的所有名称都放入作用域.但是,当我赋值MAXto时test,它MAX是赋值中使用的局部变量,因为MAX隐藏了命名空间变量.局部变量优先,并隐藏命名空间变量.

现在这是一个命名空间变量和全局变量之间冲突的例子.考虑这段修改过的代码(你可以看到它在这里编译):

const double MAX = 3.5;

namespace ns
{
   const int MAX = 3;
}

using namespace ns;

int main()
{
   int test = MAX;
}
Run Code Online (Sandbox Code Playgroud)

同样,该using指令ns:MAX带入范围,全局变量MAX也在范围内.

当我使用名为MAXin 的变量时main(),编译器报告错误,因为名称MAX现在不明确:它无法知道MAX我们指的是哪个,因为有两个非本地MAXs可供选择:既没有优先权.

prog.cpp: In function ‘int main()’:
prog.cpp:13: error: reference to ‘MAX’ is ambiguous
prog.cpp:2: error: candidates are: const double MAX
prog.cpp:6: error:                 const int ns::MAX
prog.cpp:13: error: reference to ‘MAX’ is ambiguous
prog.cpp:2: error: candidates are: const double MAX
prog.cpp:6: error:                 const int ns::MAX
Run Code Online (Sandbox Code Playgroud)