今天写程序遇到了一个奇怪的问题,编译出错报告是:“error C2065: 'cout' : undeclared identifier”和“error C2065: 'cin' : undeclared identifier”,并且错误出在Search.h头文件里的一个函数中。
首先我怀疑是调入头文件的问题,于是仔细检查了头文件,我的头文件是
#include "SearchStruct.h"
#include "Search.h"
#include <stdlib.h>
#include <iostream.h>
感觉是对的, 包含了#include <iostream.h>呀,怎么会报错呀?于是上网搜资料,发现说是namespace问题,先现将namespace介绍如下:
名字空间,
提供名字空间是防止名字空间污染问题,具体格式:
namespace namespace_name{
string str;
void print(){...};
//设定一些成员,可以是数据成员或者是函数成员
};
在外面的函数,或者是类想访问namespace_name的成员必须加"namespace_name::"比如:"namespace_name::"str"
这样就可以访问了,若没有"namespace_name::"就是错误的,
或者可以写using namespace namespace_name;就可以直接使用了如:str
名字空间就是防止重复的一种机制
如果写上using namespace std;头文件就不用带.h 如果不用using namespace std;头文件就要写上.h。原因:传统的指令应该是:#include<iostream.h>,在.net中少了.h后缀变为#include<iostream>使有。造成这种差异的原因是,visual c++.net 2003删除了旧的iostream库,因而不能再用原来的include指令调用iostream库,但是std命名空间里仍有c++标准库的定义,其中当然包括iostream库,不过std里定义的c++标准库对应的头文件没有.h后,如原来的iostream.h变为iostream原来的string.h变为string,因此预处理命令相应的也没有了.h后缀。
在6.0里面使用using namespace std;道理是一样的
可以有两种解决方法:(1)加入预编译的 using namespace std;
(2)不加using namespace std;但将cout cin写成std::cin>>i;问题就解决了。
照这样我的程序就没错呀,我又试着改成 :#include<iostream>,并在其后加上using namespace std,结果还是报错。最后突然发现原来是自己没注意头文件的调用顺序,VC中编译文件是按顺序的即写在前面得先编译。于是调用头文件改为
#include <iostream.h>
#include "SearchStruct.h"
#include "Search.h"
#include <stdlib.h>
哈,问题终于解决了!