请教关于c++名字空间的我问题?

ashizl 2008-03-18 09:25:51
小弟现在学c++,遇到一个问题。
我是按照c++ primer 第三版学的。有如下的程序:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;
int main()
{
istream_iterator<string> in( cin ), eos;
vector<string> text;
ֵ
copy( in, eos, back_inserter( text ));
sort(text.begin(), text.end());

vector<string>::iterator it;
it = unique( text.begin(), text.end() );
text.erase( it, text.end() );

//show the result
int line_cnt = 1;
for( vector< string >::iterator iter = text.begin(); iter != text.end(); ++iter, ++line_cnt)
{
cout << *iter
<<( line_cnt % 9 ? " " : "\n");

}
cout << endl;
return 0;
}

但是编译的时候总是出现错误,是名字空间的问题。错误在红色一行。
而且书上是没有 using namespace std;此行的。

凡是书上没有名字空间的地方,我编译的时候必须得加上。因此不明白这到底是怎么回事?请教。
我的编译器是gcc 4.2.1。
多谢。
...全文
383 10 打赏 收藏 举报
写回复
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
thecorr 2008-03-20
  • 打赏
  • 举报
回复
啥子问题
Lynn_Ran 2008-03-20
  • 打赏
  • 举报
回复
我记得那本书在开始的时候提到了,以后的程序默认已经用using namespace std大概这样的话,建议楼主仔细看看
IT_lau 2008-03-20
  • 打赏
  • 举报
回复
#include <iostream> 改为:
#include <iostream.h>
ashizl 2008-03-20
  • 打赏
  • 举报
回复

多谢2楼。讲的很好。学习了。
ashizl 2008-03-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 taodm 的回复:]
楼主,你难道认为书上的每个例子都要一遍又一遍老生常谈地写下using namespace std;你才能学会编程?
每个例子都只有1、2个突出点,其它细节是要你自己思考的。
[/Quote]

是了。
谢!
ashizl 2008-03-20
  • 打赏
  • 举报
回复
多谢楼上各位。
我以前只用过c,刚开始学c++。
多谢各位指点。我发先差距是巨大的。我会好好努力的。
taodm 2008-03-18
  • 打赏
  • 举报
回复
楼主,你难道认为书上的每个例子都要一遍又一遍老生常谈地写下using namespace std;你才能学会编程?
每个例子都只有1、2个突出点,其它细节是要你自己思考的。
thecorr 2008-03-18
  • 打赏
  • 举报
回复
顶了
C++ Primer的程序都是讲的c++标准的,甚至有的现在编译器都不支持。
现在的编译器都是把c++标准集成到std名字空间里的。
星羽 2008-03-18
  • 打赏
  • 举报
回复
C++之名字空间2007-08-18 04:34Namespaces
名字空间允许像类,对象和函数一样的一组实体归属于一个名称。把一个全局的范围化分成许多子的范围,每一个小的范围都有它自己的名字。

名字空间的格式是:

namespace identifier{

entities

}




包含在名字空间下的任何类,对象和函数中设立的实体必须是有效的标签符,例如:

namespace myNamespace{

int a, b;

}




这种情况,在被调用的名字空间myNamespace内部变量a和变量b被定义成了一个普通的变量,为了从myNamespace外部访问这些变量,我们必须使用作用域操作符::,例如,从myNamespace外部访问前面定义的变量,我们要这样写:

general::a

general::b







名字空间的功能一个全局的对象或者函数像另外一个对象一样使用了同一个标识符时特别有用,会引起重定义的错误,例如:

//namespace

#include <iostream>

using namespace std;

namespace first{

int var = 5;

}

namespace second{

double var = 3.1416;

}

int main() {

cout << first::var << endl;

cout << second::var <<endl;

return 0;

}







程序运行如下:

5

3.1416







这种情况我们使用了两个相同名字的全局变量:var。一个是被定义在first名字空间里的,另一个是被定义在second名字空间内的。因为有了名字空间所以没有发生重定义的错误。




using
使用using 这个关键字是为了将一个来到名字空间内的名字介绍到当前声明的区域,例如:




//namespace

#include <iostream>

using namespace std;

namespace first{

int x = 5;

int y = 10;

}

namespace second{

double x = 3.1416;

double y = 2.7183;

}

int main() {

using first::x;

using second::y;

cout << x << endl;

cout << y <<endl;

cout <<first::y <<endl;

cout <<second::x <<endl;

return 0;

}







程序运行如下:




5

2.7183

10

3.1416







如何注意这段代码,x(没有任何名字空间标识符)是引用first::x,而y引用second::y,正是由于我们在前面指定了using这个声明,所以们仍然要使用标识符全名来访问first::y 和 second::x。

关键字using也能直接指向一个实体名字空间。




//namespace

#include <iostream>

using namespace std;

namespace first{

int x = 5;

int y = 10;

}

namespace second{

double x = 3.1416;

double y = 2.7183;

}

int main() {

using namespace first;

cout << x << endl;

cout << y <<endl;

cout <<second::x <<endl;

cout <<second::y <<endl;

return 0;

}




程序运行如下:




5

10

3.1416

2.7183




这个情况,我们定义过using namespace frist,所有直接使用x和y没有使用名字空间标识符而是引用了定义的名字空间frist。




using和using namespace 仅仅是在同一个块里有效,它们规定在整个代码内,是否是在全局范围里直接使用,例如,如果我们打算首先使用一个名字空间的对象,再使用别外一个名字空间的对象,我们应该这样做:

//namespace

#include <iostream>

using namespace std;

namespace first{

int x = 5;

}

namespace second{

double x = 3.1416;

}

int main() {

using namespace first;{

cout << x << endl;

}{

using namespace second;

cout << x <<endl;

}

return 0;

}




程序运行如下:




5

3.1416




名字空间别名(Namespace alias)
我们能改变一个已经存在的名字空间的命名,相应的格式如下:




namespace new_name = current_name;




名字空间std (namespace std)
C++标准类库中的所有实体都定义在名字空间std中,这就是为什么我们通常需要包含一个using namespace std,描述在所有的程序中使用的实体都定义在iostream中。

lzpggg 2008-03-18
  • 打赏
  • 举报
回复
vc6运行没问题!!!
相关推荐
发帖
C++ 语言

6.3w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2008-03-18 09:25
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下