解决VC6.0 namespace兼容性问题

来源:互联网 发布:怎么看淘宝店主的电话 编辑:程序博客网 时间:2024/06/06 02:15

        由于VC6.0诞生在C++标准之前,所以对标准的兼容性不好,就算打了SP6补丁之后一直还存在着诸多问题。例如,当包含<iostream>头文件,并用using namespace std;进行域声明时就会出现问题。典型的问题是在重载<<或>>操作符时提示函数不能访问私有变量(即使声明为友元函数);或者在重载了运算符之后使用时依然提示运算符没有定义,并且VC6在出现这个问题时给出的错误提示让人摸不着头脑,比方说定义了一个STUDENT类,并为该类重载了>>操作符,

操作符声明为:friend istream& operator>>(istream& is,Student& st);

之前的的头文件包含为#include <iostream>

并且声明using namespace std;

这个时候如果在_tmain()或者main()中定义了ifstream fin;和Student s;并且使用fin>>s;从文件中提取s时就会报类似:

no operator defined which taks left hand operant "ifsteam"的错误,意思是说接收左值类型为ifstream的>>操作符没有定义。

        可以说这个提示是混淆的,问题不是出在ifstream(他是istream的子类,根据子类替换原则可以替换istream),而是为Student类重载的>>函数没有被接收。我不清楚是什么原因导致了这一错误,但是可以猜想是因为<iostream>和<iostream.h>的冲突导致。在VC6.0中可以直接包含头文件<iostream.h>(而非<iostream>,这两者在VC6.0中是有区别的),不用声明std域,直接可以用如istream,ostream,cin,cout,endl;等等在认识上应该属于std域的成员。我想这就是导致重载失效的原因(重载了<iostream>中的操作符而没有重载<iostream.h>中的操作符??仅是我的猜想)。VC6应当默认的是不带STD的operator>>所以也许在声明了using namespace std之后反而造成了冲突。

         一种解决方案是直接用<iostream.h>,去掉所有的std;这样确实在VC6.0中可以解决一些问题,但是总感觉不是最好的解决方案,并且这样做造成代码不能向上迁移。另外,直接使用<iostream.h>貌似会造成声明的友元函数不能访问私有变量的问题(这一问题可以通过在头文件中定义友元函数来解决)。

      经过了几次试验之后,发现最好的解决方案是坚决抵制<iostream.h>,使用std作用域,但是不是直接声明using namespace std;

而是一个一个声明,如using std::cin;using std::cout;using std::sort;using std::istream;等等。可以将这些作用域声明和头文件包含的操作都放到一个头文件中,如stdafx.h,然后在要使用时包含就OK了,经试验在VC6.0下用这样的方式重载运算符,无论是作为成员函数还是友元函数,都不会再报奇怪的错误了!

原创粉丝点击