0

我试图在我的代码中使用命名空间,所以我有一个看起来像这样的头文件:

#include <string>

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

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

这当然是一个简化的例子,我有很多头文件,并不是所有的头文件都显示这种行为。我不确定是什么原因造成的,我认为编译器也会尝试全局命名空间。

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

4

2 回答 2

1

这当然是一个简化的例子,我有很多头文件,并不是所有的头文件都显示这种行为。我不确定是什么原因造成的,我认为编译器也会尝试全局命名空间。

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

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

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

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

于 2013-11-07T04:18:20.400 回答
0

使用:

using namespace std;

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

int main() ...

代码以您上面的示例作为标头进行编译。

移动

使用命名空间标准;

如果我不使用 std::string,在头文件下方(在我的情况下为 test_header.h)将导致它失败。

那是你遇到的问题吗?

于 2013-11-07T04:25:01.470 回答