命名空间名称无法识别

时间:2013-12-30 08:22:22

标签: c++ c++11

我有以下两个示例c ++文件:

档案:foo.cc

namespace test_ns {
int x = 100;
}

文件:bar.cc

using namespace test_ns;

extern int x;

int main()
{
    x = 200;
    return 0;
}

我必须做一些非常愚蠢的事情,因为我收到以下编译错误:
    bar.cc:2:17:错误:'test_ns'不是命名空间名称     bar.cc:2:24:错误:';'之前的预期命名空间名称令牌

但是,我的主要问题(在我解决命名空间错误之后),使用代码,我应该能够在bar.cc中使用“x”,还是需要使用其他限定符。

很抱歉打扰这么简单的问题,但我对这么简单的程序感到非常难过。

谢谢你, 艾哈迈德。

3 个答案:

答案 0 :(得分:3)

就像C ++中的每个其他名称一样,必须先声明名称空间名称才能访问它。在编译bar.cc时,编译器不知道test_ns是名称空间名称 - 您还没有为其提供声明。

命名空间和using namespace不是神奇的技巧,让您可以解决声明要使用的任何内容的必要性。要使其工作,请创建一个头文件:

<强> foo.hh

namespace test_ns {
  extern int x;
}

然后在#include "foo.hh"bar.cc,然后从extern int x;移除bar.cc。这将使这两个翻译单元形成一个有效的程序。在您这样做之后,参考x中的bar.cc确实会引用test_ns::x(感谢using指令)。


作为旁注,如果您不从extern int x;删除bar.cc(在包含头文件之后),它将声明一个新的全局变量::x和不是指test_nest::x。源文件中的using namespace允许您在不引用类的命名空间的情况下定义类成员,但是命名空间范围实体(变量和函数)总是必须在命名空间内定义或使用限定名称。

答案 1 :(得分:0)

它们位于不同的编译单元中。您需要在公共标头中声明命名空间;您可以使用:

namespace test_ns {}

答案 2 :(得分:0)

命名空间在不同的文件中定义。它需要在头文件中定义,该文件应包含在bar.cc中。