这是不是vc.net2003的一个bug??!!实在太奇怪了

leesg 2003-09-17 03:24:45
我在vc.net2003中做了一个如下的纯虚类
class IStorageA
{
public:
...(其他纯虚函数)

virtual IStorageA& __stdcall operator>>(unsigned& u) = 0;
virtual IStorageA& __stdcall operator>>(char& ch) = 0;
virtual IStorageA& __stdcall operator>>(short& w) = 0;
virtual IStorageA& __stdcall operator>>(int& i) = 0;
virtual IStorageA& __stdcall operator>>(double& d) = 0;
virtual IStorageA& __stdcall operator>>(float& f) = 0;
virtual IStorageA& __stdcall operator>>(long& l) = 0;
virtual IStorageA& __stdcall operator>>(unsigned long& dw) = 0;
virtual IStorageA& __stdcall operator>>(unsigned short& w) = 0;
virtual IStorageA& __stdcall operator>>(unsigned char& by) = 0;

//输出
virtual IStorageA& __stdcall operator<<(unsigned u) = 0;
virtual IStorageA& __stdcall operator<<(char ch) = 0;
virtual IStorageA& __stdcall operator<<(short w) = 0;
virtual IStorageA& __stdcall operator<<(int i) = 0;
virtual IStorageA& __stdcall operator<<(double d) = 0;
virtual IStorageA& __stdcall operator<<(float f) = 0;
virtual IStorageA& __stdcall operator<<(unsigned long dw) = 0;
virtual IStorageA& __stdcall operator<<(long l) = 0;
virtual IStorageA& __stdcall operator<<(unsigned short w) = 0;
virtual IStorageA& __stdcall operator<<(unsigned char by) = 0;

...(其他纯虚函数)

};
然后从它派生了一个类CFileStorage,并实例化,结果发现在它的虚函数表中,所有流操作函数的次序都与声明的时候相反了而其他函数则是一致的,变成了如下这样

CFileStorage::operator>>(unsigned char& by)
CFileStorage::operator>>(unsigned short& w)
CFileStorage::operator>>(unsigned long& dw)
CFileStorage::operator>>(long& l)
CFileStorage::operator>>(float& f)
CFileStorage::operator>>(double& d)
CFileStorage::operator>>(int& i)
CFileStorage::operator>>(short& w)
CFileStorage::operator>>(char& ch)
CFileStorage::operator>>(unsigned& u)

CFileStorage::operator<<(unsigned char by)
CFileStorage::operator<<(unsigned short w)
CFileStorage::operator<<(long l)
CFileStorage::operator<<(unsigned long dw)
CFileStorage::operator<<(float f)
CFileStorage::operator<<(double d)
CFileStorage::operator<<(int i)
CFileStorage::operator<<(short w)
CFileStorage::operator<<(char ch)
CFileStorage::operator<<(unsigned u)
我试过了在c++Builder中与声明次序完全一致,这是不是vc .net2003的一个bug?!!
...全文
36 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
leesg 2003-09-24
  • 打赏
  • 举报
回复
多谢指点,但是,这是不是不符合标准C++
FrankZhang123 2003-09-23
  • 打赏
  • 举报
回复
本来不同的编译器生成的虚函数的次序就没有严格的规定,你的头文件能够改一改在两边用算是很幸运的了。各个编译器生成的函数的内部名称都可能不一样,这样你的声明根本就不能拿到别的地方用。
如果你要实现COM组件和接口的话,可以用IDL文件,好像CBuilder和VC都认,而且生成的虚函数应该是一样的。
leesg 2003-09-22
  • 打赏
  • 举报
回复
有大问题,因为我这个接口是C++ Builder实现,由VC调用的,结果调用的时候,就错位了,我现在只能在两边使用不同的头文件,里面的对应流操作纯虚函数的顺序全倒过来,才解决问题。如果是这样,那么用VC做的COM组件岂不是不能被其他语言调用??
leesg 2003-09-19
  • 打赏
  • 举报
回复
这不是用不用模板的问题,这是编译器的问题
知行合一2018 2003-09-19
  • 打赏
  • 举报
回复
我好象没遇到过这个问题。但就算是反了也无所谓啊,反正函数声明的前后又不会影响你的实现。
leesg 2003-09-18
  • 打赏
  • 举报
回复
没人知道这是怎么回事吗??
sarcophile 2003-09-17
  • 打赏
  • 举报
回复
天!搞这么复杂,可以用魔板的

7,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 VC.NET
社区管理员
  • VC.NET社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧