头文件中的字符串原型需要iostream
String prototype in header requires iostream?
所以在我的头,我做了一个字符串:string s;
编译器在这个怪胎。我知道string是iostream::std的一部分。我必须包括它在头,而不是在。cpp文件吗?如果是这样,它是坏的,如果其他文件使用头包括iostream?我该怎么处理呢?
编辑:也为矢量,因为它似乎我将需要它在我的作业很多。
编辑2:我记得在标题的很多例子中看到#ifndef,我觉得它可能有助于我的问题,但我似乎找不到一个好的解释。
string
和vector
是与iostream
分开的,它们都是std
命名空间的一部分。你只需要在你的头文件中适当地限定它们。
Assignment.h
#include <string>
#include <vector>
// no need to #include <iostream>
struct Obj
{
// fully qualified with std::
std::string s_;
// same:
std::vector<std::string> v_;
};
如果需要,可以在其他头文件中包含头文件,并且不要创建循环依赖关系。这里的情况不是这样,因为<string>
不是用户生成的标头。
如果您将using namespace std;
添加到标题中而不是指定类型的范围,那将是不好的。这样做可以在包含头文件的所有文件中用namespace std
的内容填充全局命名空间。
当然,如果您在自己的头中使用string
,则需要包含头。这是因为编译器需要计算具有string
成员的对象的内存布局,这意味着它需要首先计算string
的布局,这意味着它必须看到string
的完整声明。
没有直接的方法可以解决这个问题,但如果这对你来说是一个问题,你可以使用粉刺习语来解决它。这种模式的好处之一是,它允许您在类中聚合对象,而不需要首先包含其声明(而不是向前声明该类),如下所示:
class std::string; // forward declaration
class my_class
{
std::string* psz;
};
当然,现在你负责构造一个string
,并获得一个指针到它自己,也手动管理该对象。此外,访问该字符串现在需要额外的指针解引用。
是的,你需要包括<string>
,因为std::string
实际上是basic_string
模板的typedef
。
typedef basic_string<char> string;
如果它是一个类,在某些情况下你可以不包括它的定义而直接声明它。
class string;
- 函数向量_指针有不同的原型,我可以构建一个吗
- 是否可以用"iostream"包装现有的TCP/OOpenSSL会话
- 需要从 istream 和 ostream 派生 iostream
- 功能原型的目的
- getline() 的原型/库是什么;
- std::带有自定义缓冲区的 iostream 不允许我写入
- 具有enable_if外部类原型的模板类构造函数定义
- 函数如何通知用户它基于函数原型抛出异常?
- 在C++中包含原型文件的正确方法是什么?
- 在函数中拥有函数原型的目的是什么?
- 新的放置取决于 iostream
- 包含在 <initializer_list> <iostream>?
- 什么..(省略号)作为函数原型中唯一的函数参数,C++?
- 为什么在包含iostream时可以使用printf()?
- 是否可以使用 libclang python 解析 cpp 文件中没有标头的函数原型
- 如果原型是本地的,则使用流 I/O C++类型约束将失败
- 如何进行原型消息交叉引用?
- 如果 iostream 对象不可复制,为什么以下代码是合法的?
- 为什么我必须在包含后写 std::cin <iostream>?
- 头文件中的字符串原型需要iostream