与名称空间名称相同的对象名称:重新声明
object name identical to namespace name: redeclaration
当文件范围内定义的对象与现有命名空间同名时,为什么会出现问题?为什么这在函数范围内(例如在 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 {
如果在定义了很多不同命名空间的地方包含了很多文件,这种情况就很容易实现。
有人可以解释一下吗?谢谢!
干杯
可以在不同的(可能是嵌套的)作用域中声明和使用相同的标识符,但不能在同一个作用域中使用。您的问题与名称空间是在文件范围内定义的事实无关。将它们移动到另一个命名空间 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
}
但是 bar::Bar bar;
中的变量 bar
属于另一个比命名空间 bar
更局部的范围。 foo::Foo foo;
中的变量 foo
和命名空间 foo
在完全相同的范围内。
由于大多数变量和命名空间不应在 global/file 范围内声明,因此拥有多个命名空间根本不是问题。
当文件范围内定义的对象与现有命名空间同名时,为什么会出现问题?为什么这在函数范围内(例如在 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 {
如果在定义了很多不同命名空间的地方包含了很多文件,这种情况就很容易实现。
有人可以解释一下吗?谢谢! 干杯
可以在不同的(可能是嵌套的)作用域中声明和使用相同的标识符,但不能在同一个作用域中使用。您的问题与名称空间是在文件范围内定义的事实无关。将它们移动到另一个命名空间 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
}
但是 bar::Bar bar;
中的变量 bar
属于另一个比命名空间 bar
更局部的范围。 foo::Foo foo;
中的变量 foo
和命名空间 foo
在完全相同的范围内。
由于大多数变量和命名空间不应在 global/file 范围内声明,因此拥有多个命名空间根本不是问题。