偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

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

類型引用

 template
  class Foo

  {

  typedef T::SomeType SomeType;

  };

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

template
  class Foo

  {

  typedef typename T::SomeType SomeType;

  };

通過(guò)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++中同樣沒(méi)有問(wèn)題,但是GCC中不能通過(guò)。因?yàn)镚CC并不知道base_func,m_base_member是什么。對(duì)于這個(gè)問(wèn)題,你可以有兩種改法:

改法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ù)(或者訪問(wèn)其成員變量),甚至可以定義其實(shí)例。這種語(yǔ)法對(duì)C++來(lái)說(shuō)確實(shí)顯得怪異。因?yàn)榈鹊骄幾g后面的SomeClass時(shí),他又可以在其函數(shù)中定義class Foo的實(shí)例,從而出現(xiàn)交叉引用的情況。這在非模板函數(shù)的情形下就算你用VC++亦難以做到。

遇到這種情況,該如何移植到GCC中?這個(gè)問(wèn)題有點(diǎn)棘手。我個(gè)人認(rèn)為出現(xiàn)這種情況是不太應(yīng)該的,這意味著對(duì)類與類之間的關(guān)系混淆不清。你需要仔細(xì)審視一下這兩個(gè)類正確的關(guān)系是什么。如果是移植庫(kù)(例如WTL就有多處這樣的情形)的過(guò)程中遇到這種情況,可以把函數(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é)任編輯:楊鵬飛 來(lái)源: 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-27 15:11:17

VC++編譯異常

2010-01-26 13:29:46

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

2011-07-14 20:42:14

C++

2013-09-02 15:49:38

DirectX 9Windows

2011-09-05 09:28:58

MySQLMongoDB

2010-01-28 15:56:38

VC++ 6.0編譯

2010-03-04 10:04:10

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

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遷移

2010-01-22 10:44:10

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

2009-12-09 13:29:17

VC++ 2005 E

2011-07-13 18:00:51

CC++VC

2013-06-17 10:37:54

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

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