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

时间:2011-08-01 21:50:23

标签: c++ namespaces

// main.cpp
const double MAX = 3.5;

namespace ns
{
   const int MAX = 3;
}

int main()
{
}

会导致重新定义错误吗?

我指的是this MSDN page,它在备注部分说这是一个错误。

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

using ns::MAX;

2 个答案:

答案 0 :(得分:5)

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

事实上,你可以compile it and see for yourself


编辑:现在您已经提供了您提到的MSDN页面的链接......

该MSDN页面正在讨论using directive

的上下文中的名称冲突
  

如果局部变量与命名空间变量同名,则   命名空间变量被隐藏。拥有命名空间是一个错误   与全局变量同名的变量。

Here's an example隐藏了一个名称空间变量的局部变量,该变量已被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
}

包含using指令会将ns命名空间内声明的所有名称都纳入范围。但是,当我将MAX的值分配给test时,它是分配中使用的局部变量MAX,因为隐藏了命名空间变量MAX。局部变量优先,并隐藏命名空间变量。

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

const double MAX = 3.5;

namespace ns
{
   const int MAX = 3;
}

using namespace ns;

int main()
{
   int test = MAX;
}

同样,using指令将ns:MAX纳入范围,全局变量MAX也在范围内。

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

MAX

答案 1 :(得分:2)

他们不会,因为一个在文件范围内,另一个在命名空间范围内。