首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

弱弱地问问,string到底是定义在哪里的呀?解决方法

2013-12-05 
弱弱地问问,string到底是定义在哪里的呀?某书上介绍string这个class时的话:The class string is defined i

弱弱地问问,string到底是定义在哪里的呀?
某书上介绍string这个class时的话:

The class string is defined in the library whose name is also <string>, and
the definitions are placed in the std namespace.

这两句怎么理解呀?类似的还有vector等等。 string class
[解决办法]
string这个类定义在标准库中,包含在string头文件中,所以我们需要用include <string>
string这个名字定义在std名字空间中,所以我们常写std::string;
一个表示类,而一个仅仅是表示一个名字
[解决办法]
在VS里,对着<string>右击,打开文档就可以了,或者ctrl+shift+G

VS下,一般用_STD_BEGIN和_STD_END来表示namespace std的开始和结束(定义了相应的宏)
[解决办法]

引用:
Quote: 引用:

string这个类定义在标准库中,包含在string头文件中,所以我们需要用include <string>
string这个名字定义在std名字空间中,所以我们常写std::string;
一个表示类,而一个仅仅是表示一个名字

太抽象了啊。为什么我们自己定义的class没有相应的namespace?

不是没有,是你自己不写啊!namespace的名称是你自己定的,和标准本身无关。你可以叫A,叫B,叫任何名字,但是最好别用已有的名字,会混淆的。

namespace的作用就是区分大家写的同名的东西,比如我自己写了一个string,std里有一个string,那么比如我的namespace是A,那么我就会A::string。如果你要用STL里的,就是std::string。

如果你直接用using解除了,那就等于namespace无效了,就可以直接写string了,但是缺点就是暴露了命名空间。如果你同时暴露了A和std的string,那么你写的string到底是谁的?

不建议在头文件中加using就是这个原因,你根本就没给人选择权。一旦引入,就等于解除了命名空间,如果我这里同时需要std和A的string,那不是很麻烦?对于大型项目无异于增加管理成本,都不应该在头文件里写这个。
[解决办法]
<string>的sysnopsis里直接确定了:
namespace std
{
template<class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >
class basic_string;
typedef std::basic_string<char> string;
}

热点排行