class A{
private:
std::string id;
public:
void f();
};
给出编译时错误。但是,如果我在include <string>
的顶部,它编译正确。不过,我不想在标题中使用include语句。我该怎么做?包含在头文件中
class A{
private:
std::string id;
public:
void f();
};
给出编译时错误。但是,如果我在include <string>
的顶部,它编译正确。不过,我不想在标题中使用include语句。我该怎么做?包含在头文件中
在这种情况下,您必须包含<string>
才能使用std::string
。
只有当您只使用标题中对象的引用或指针时,才能避免#including标题。在这种情况下,您可以使用前向声明。但是since std::string is a typedef, you can't forward declare it,你必须包括它。
我确定你正试图按照建议尽量少尝试#include
,但在这种情况下你不能遵循它。
std :: string在标准名称空间的<string>
头文件中定义。你必须包括它。
您可能已经听说在标头中使用using namespace std;
是不明智的,因为包含该标头的任何内容都会与全局名称空间中的所有内容紧密相连。包括你需要的头文件是完全可以接受的。
将标题包含在其他标题中是完全必要的。尽可能减少它是明智的,但从根本上说,如果你的课程取决于std::string
,那么你别无选择,只能在#include <string>
的标题中找到答案。另外,取决于任何和/或所有标准类别绝对没有错 - 毕竟,它们被授权在任何实现中提供。这是using namespace std;
这是皱起了眉头。
通过在包含其他头文件之前在实现文件中包含必要的文件,即确保#include <string>
出现在实现文件(.cpp)的第一行,然后包含您自己的头文件文件。
这不完全是最佳做法。所有的头文件都应该满足它们自己的依赖关系,所以头文件的用户不需要关心依赖关系。至少这是我的愚见。
不幸的是,你无法绕过它。
即使你的类定义是这样的:
class A {
private:
std::string* id;
public:
void f();
};
那么还是有没有什么你可以做,如前宣布std::basic_string<char, etc>
是一个痛苦的屁股。我甚至不打算演示。
幸运的是,虽然头文件中的using namespace std
是一个明确的禁忌,但您通常可以在标头中使用标准头文件,而不用担心它。
只要您知道,如果您使用内联markdown语法,则可以确保代码示例不会被解释为HTML,因为括号中的内容。用反引号('\'')来包围这个短语。 – 2011-05-22 16:10:52
@Cody Gray:非常感谢!我不知道。 – 2011-05-22 20:09:22