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

看一個例子,XE2 C++編譯器還是有改進的,解决思路

2012-03-11 
看一個例子,XE2 C++編譯器還是有改進的,先上代碼:C/C++ code#include vectorclass PACKAGE Base{protect

看一個例子,XE2 C++編譯器還是有改進的,
先上代碼:

C/C++ code
#include <vector>class PACKAGE Base{protected : Base(): Port(0){}public :  int Port ; virtual bool Init() = 0 ; virtual ~Base() {}};class PACKAGE Base_A :public  Base{protected :public : bool Init() {return false;} ; ~Base_A() {} Base_A():Base() {} static  Base * CreateMe(){return new Base_A();}};class PACKAGE Base_B :public  Base{protected :public : bool Init() {return false;} ; ~Base_B() {} Base_B():Base() {} static  Base * CreateMe(){return new Base_B();}};typedef Base *(*TCreateObject)();struct TBaseInfo{  TCreateObject Create ;  AnsiString ID ;  String Title ;};std::vector<TBaseInfo> All ;void Test(){  TBaseInfo tmp[2] =  {      {&Base_A::CreateMe,"A","this is A"},      {&Base_B::CreateMe,"A","this is B"},            //XE2有趣的是,這個逗號無論有沒有,均不報錯。  };//現象是XE2能正常賦值,B2007 賦值不正常,B2007 需要TBaseInfo寫一個構造函數//TBaseInfo(TCreateObject,String,String),通過構造函數可以正常賦值。//爲什麽 B2007 不能正常賦值呢?  All.resize(2);  All[0] = tmp[0];   All[1] = tmp[1];}TForm1 *Form1;//---------------------------------------__fastcall TForm1::TForm1(TComponent* Owner)    : TForm(Owner){  Test();  if(All[0].Create == Base_A::CreateMe)    Caption = "OK" ;  else    Caption = "ERROR"  ;}//---------------------------------------


在 XE2 能正常編譯運行,結果也正確"OK"。
在 B2007 編譯失敗或鏈接失敗,提示信息是什麽內部致命失敗。
如果將這些代碼分散到不同單元中,在一定條件下,B2007也正常編譯鏈接,
但結果是"ERROR" , 這個就會産生運行期錯誤了。

有興趣可以測試一下各版本的情況。

[解决办法]
一般人用不了这么复杂的。
[解决办法]
学习了
[解决办法]
不是一般地复杂
[解决办法]
我觉得,能发现编译器有问题得人都是牛人
[解决办法]
遇到內部致命失敗是最郁闷的问题,都不知道怎么改
[解决办法]
在CB2010上测试OK

热点排行