不在其他命名空间中检查全局命名空间

时间:2013-11-07 04:08:40

标签: c++ namespaces

我正在尝试在我的代码中使用命名空间,所以我有一个如下所示的头文件:

#include <string>

namespace AppNamespace
{
  class A
  {
    std::string name;
  };
}

当我尝试编译它时,它说“'string'不是AppNamespace :: std的成员”。如果我删除字符串前面的std::,或者我写::std::string name,那么编译就可以了。

这当然是一个简化的例子,我有很多头文件,并不是所有这些都显示出这种行为。我不确定是什么导致这种情况,我认为编译器总是会尝试全局命名空间。

如果这很重要,我目前正在使用Visual Studio 2012.

2 个答案:

答案 0 :(得分:1)

  

这当然是一个简化的例子,我有很多头文件,并不是所有这些都显示出这种行为。我不确定是什么导致这种情况,我认为编译器总是会尝试全局命名空间。

在某些时候你必须有这样的东西:

namespace AppNamespace
{
  #include <string> // or #include "my_header" which in turn includes <string>

  class A
  {
    std::string name;
  };
}

#include指令不尊重名称空间。您需要将它们全部移动到全局命名空间范围,或者标准头的每个(可能是嵌套的)包含将以创建嵌套命名空间std的形式导致未定义的行为。

答案 1 :(得分:0)

使用:

using namespace std;

#include <iostream>
#include "test_header.h"

int main() ...

代码以上述示例的任一方式编译为标题。

移动

  

使用namespace std;

如果我不使用std :: string,头文件(在我的情况下是test_header.h)下面的

将导致它失败。

这是你遇到的问题吗?