我正在尝试在我的代码中使用命名空间,所以我有一个如下所示的头文件:
#include <string>
namespace AppNamespace
{
class A
{
std::string name;
};
}
当我尝试编译它时,它说“'string'不是AppNamespace :: std的成员”。如果我删除字符串前面的std::
,或者我写::std::string name
,那么编译就可以了。
这当然是一个简化的例子,我有很多头文件,并不是所有这些都显示出这种行为。我不确定是什么导致这种情况,我认为编译器总是会尝试全局命名空间。
如果这很重要,我目前正在使用Visual Studio 2012.
答案 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() ...
代码以上述示例的任一方式编译为标题。
移动
如果我不使用std :: string,头文件(在我的情况下是test_header.h)下面的使用namespace std;
将导致它失败。
这是你遇到的问题吗?