-1

当文件范围中定义的对象与现有命名空间具有相同名称时,为什么会出现问题?为什么这在函数范围内可以(例如在 main 内)?

例子:

#include <iostream>

namespace foo {
    class Foo {};
}

namespace bar {
    class Bar {};
}

// foo::Foo foo; // <-- This will give error

int main () {
    bar::Bar bar;  // <-- This is ok

    std::cout << "Program ran successfully" << std::endl;
    return 0;
}

我得到的错误是

ns_main.cpp:11:10: error: ‘foo::Foo foo’ redeclared as different kind of symbol
 foo::Foo foo;
          ^
ns_main.cpp:3:15: error: previous declaration of ‘namespace foo { }’
 namespace foo {

如果在定义了许多不同名称空间的地方包含大量文件,则这种情况很容易实现。

有人可以解释一下吗?谢谢!干杯

4

1 回答 1

0

相同的标识符可以在不同的,可能是嵌套的范围内声明和使用,但不能在同一个范围内。您的问题与命名空间是在文件范围内定义的事实无关。将它们移动到另一个命名空间outer并不能解决错误:

#include <iostream>

namespace outer {
  namespace foo {
    class Foo {};
  }

  namespace bar {
    class Bar {};
  }
  foo::Foo foo; // <-- This will still give an error
}

int main() {
  outer::bar::Bar bar; // <-- This is still ok
}

然而,变量barinbar::Bar bar;属于另一个比 namespace 更局部的范围bar。变量fooinfoo::Foo foo;和命名空间foo在完全相同的范围内。

由于您的大多数变量和命名空间不应在全局/文件范围内声明,因此拥有许多命名空间根本不是问题。

于 2015-08-18T15:24:18.260 回答