C++ 无法在命名空间范围上分配变量

C++ 无法在命名空间范围上分配变量,c++,c++11,c++14,C++,C++11,C++14,我遇到了一些不清楚的事情: namespace Foo { int a; } namespace Foo { // Foo::a = 2; // Why can't do an assignment here? void b() { Foo::a = 2; // OK } } 输出 error: ‘a’ does not name a type 我很好奇为什么我们不能在命名空间范围上赋值 功能块内的赋值是否正常 有什么想法吗 我很好奇为什么命名空间范围中的

我遇到了一些不清楚的事情:

namespace Foo {
  int a;
}

namespace Foo {
  // Foo::a = 2;   // Why can't do an assignment here?
  void b() {
      Foo::a = 2;  // OK
  }
}
输出

error: ‘a’ does not name a type
我很好奇为什么我们不能在命名空间范围上赋值

功能块内的赋值是否正常

有什么想法吗

我很好奇为什么命名空间范围中的赋值被视为定义

赋值是表达式语句,表达式不能在命名空间范围内。命名空间范围中只能有声明语句(定义是声明)

而功能块内的赋值不是


表达式语句可以在块范围内。

不能在函数外使用常规语句

也许您首先需要一个声明,然后是一个定义


赋值表达式如何合法地出现在名称空间范围内?您的代码示例在某种程度上根本没有太多的链接代码。您是从哪里获得“@codekaizer”的“错误:重复定义”的?哪个编译器会发出这样的错误@VTT,我使用的是在线编译器-@codekaizer它是gcc 6.3,它没有发出声明的错误,而是报告“error:”命名空间“Foo”中的“a”没有命名类型“谢谢”。有道理。我很难在这本书中找到那条规则。你知道我在哪里可以找到更多关于“一般声明”的规则吗?@codekaizer没有“一般声明”这样的术语。我的意思是几乎所有不是声明或定义的东西(或多或少)。
namespace Foo {
  extern int a;  // Declare variable
}

namespace Foo {
  int a = 2;  // Define and initialize the variable
}