成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

從VC++移植到GCC后的語(yǔ)法差異

開發(fā)
本文主要介紹了從VC++到GCC移植上存在的三點(diǎn)語(yǔ)法差異以及通過哪些改法可以消除這些差異,希望可以給讀者帶來幫助。

類型引用

 template
  class Foo

  {

  typedef T::SomeType SomeType;

  };

這段代碼在VC++中一點(diǎn)問題也沒有,但是GCC并不允許,因?yàn)樗恢繲::SomeType是什么。你需要改為:

template
  class Foo

  {

  typedef typename T::SomeType SomeType;

  };

通過typename T::SomeType告訴GCC,SomeType是一個(gè)類型名,而不是其他東西。

當(dāng)然,這種情況不只是出現(xiàn)在typedef中。例如:

template
  void visit(const Container& cont)

  {

  for (Container::const_iterator it = cont.begin(); i

  t != cont.end(); ++it) ...

  }

這里的Container::const_iterator同樣需要改為typename Container::const_iterator。

#p#

基類成員引用

template
  class Foo :

  public Base {

  public: void foo()

  { base_func();

  m_base_member = 0;

  }

  };

這段代碼在VC++中同樣沒有問題,但是GCC中不能通過。因?yàn)镚CC并不知道base_func,m_base_member是什么。對(duì)于這個(gè)問題,你可以有兩種改法:

改法1:加上域作用符Base::

 template
  class Foo :

  public Base

  {

  public: void foo()

  { Base::base_func();

  Base::m_base_member = 0;

  }

  };

改法2:使用using指示符

template
  class Foo :

  public Base

  {

  public: using Base::base_func;

  using Base::m_base_member;

  void foo()

  { base_func();

  m_base_member = 0;

  }

  };

這兩種方法各有好處,在class Foo中出現(xiàn)大量的Base::base_func、m_base_member的引用時(shí),使用using是方便的。而如果只有一次,那么方法1顯得簡(jiǎn)短。

#p#

交叉引用許可

  class SomeClass;
  template class Foo
   {
   public: void foo(SomeClass& a)
   { a.some_func();
   }
   void foo2()
   { SomeClass a; a.some_func();
   }
   };
   class SomeClass
   {
   public: void some_func()
   { ... }
   };

由于VC++對(duì)模板函數(shù)的遲編譯,因此,一個(gè)模板類不只是可以調(diào)用一個(gè)尚未出現(xiàn)的類成員函數(shù)(或者訪問其成員變量),甚至可以定義其實(shí)例。這種語(yǔ)法對(duì)C++來說確實(shí)顯得怪異。因?yàn)榈鹊骄幾g后面的SomeClass時(shí),他又可以在其函數(shù)中定義class Foo的實(shí)例,從而出現(xiàn)交叉引用的情況。這在非模板函數(shù)的情形下就算你用VC++亦難以做到。

遇到這種情況,該如何移植到GCC中?這個(gè)問題有點(diǎn)棘手。我個(gè)人認(rèn)為出現(xiàn)這種情況是不太應(yīng)該的,這意味著對(duì)類與類之間的關(guān)系混淆不清。你需要仔細(xì)審視一下這兩個(gè)類正確的關(guān)系是什么。如果是移植庫(kù)(例如WTL就有多處這樣的情形)的過程中遇到這種情況,可以把函數(shù)的實(shí)現(xiàn)體改為放到類定義體外,如下:

class SomeClass;
  template
    class Foo
   {
   public: void foo(SomeClass& a);
   void foo2(); };
   class SomeClass
   {
   public: void some_func()
   { ... }
   };
   template inline void Foo::foo(SomeClass& a)
   {
   a.some_func();
   }
   template inline void Foo::foo2()
   {
   SomeClass a;
   a.some_func();
   }

【編輯推薦】

  1. 詳解GCC的下載和安裝
  2. GCC使用入門
  3. GCC 4.0的新特性
責(zé)任編輯:楊鵬飛 來源: IT專家網(wǎng)論壇
相關(guān)推薦

2010-01-27 17:42:58

VC++開發(fā)環(huán)境

2011-04-13 11:11:36

VC++托盤程序

2010-01-21 17:22:21

VC++

2011-07-13 11:20:55

VC++ODBC

2010-01-26 13:29:46

VC++應(yīng)用程序

2010-01-27 15:11:17

VC++編譯異常

2011-07-14 20:42:14

C++

2013-09-02 15:49:38

DirectX 9Windows

2011-09-05 09:28:58

MySQLMongoDB

2010-03-04 10:04:10

Linux動(dòng)態(tài)庫(kù)

2010-01-28 15:56:38

VC++ 6.0編譯

2010-01-20 13:52:19

2011-07-14 22:04:16

VC++

2010-03-24 09:06:02

Visual Stui

2011-05-13 15:31:24

VC++

2011-12-14 09:46:14

LinuxUnix遷移

2009-12-09 13:29:17

VC++ 2005 E

2011-07-13 18:00:51

CC++VC

2010-01-22 10:44:10

VC++應(yīng)用程序

2013-06-17 10:37:54

產(chǎn)品設(shè)計(jì)移動(dòng)設(shè)計(jì)產(chǎn)品規(guī)劃
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 久久久久国产精品午夜一区 | 国产二区视频 | 欧美精品欧美精品系列 | 亚洲精品乱码久久久久久久久 | 中文字幕不卡在线观看 | 一区二区精品 | 亚洲国产成人精品女人久久久 | 少妇久久久久 | 日日骚网| 黄色小视频入口 | 91人人在线 | 欧美片网站免费 | 午夜欧美一区二区三区在线播放 | 久久久精品一区二区 | 国产精品一区2区 | 福利视频一二区 | 久久艹免费视频 | 久久婷婷麻豆国产91天堂 | 在线观看你懂的网站 | 成人亚洲一区 | 91啪影院| 中文字幕亚洲精品 | 中文字幕在线视频免费视频 | 91看片网 | 伊人伊成久久人综合网站 | 亚洲欧洲精品在线 | 曰韩三级 | 天天综合久久 | 精品日韩在线 | 五月婷婷在线视频 | 久久国际精品 | 人人玩人人添人人澡欧美 | 欧美日韩在线看 | 欧美日韩中文字幕在线播放 | 久国产视频 | 九九热视频这里只有精品 | avmans最新导航地址 | 在线观看国产视频 | 人人看人人射 | 男人天堂av网站 | 伊人网站在线观看 |