自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

從VC++移植到GCC后的語法差異

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

類型引用

 template
  class Foo

  {

  typedef T::SomeType SomeType;

  };

這段代碼在VC++中一點問題也沒有,但是GCC并不允許,因為它不知道T::SomeType是什么。你需要改為:

template
  class Foo

  {

  typedef typename T::SomeType SomeType;

  };

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

當然,這種情況不只是出現(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中不能通過。因為GCC并不知道base_func,m_base_member是什么。對于這個問題,你可以有兩種改法:

改法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的引用時,使用using是方便的。而如果只有一次,那么方法1顯得簡短。

#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++對模板函數(shù)的遲編譯,因此,一個模板類不只是可以調用一個尚未出現(xiàn)的類成員函數(shù)(或者訪問其成員變量),甚至可以定義其實例。這種語法對C++來說確實顯得怪異。因為等到編譯后面的SomeClass時,他又可以在其函數(shù)中定義class Foo的實例,從而出現(xiàn)交叉引用的情況。這在非模板函數(shù)的情形下就算你用VC++亦難以做到。

遇到這種情況,該如何移植到GCC中?這個問題有點棘手。我個人認為出現(xiàn)這種情況是不太應該的,這意味著對類與類之間的關系混淆不清。你需要仔細審視一下這兩個類正確的關系是什么。如果是移植庫(例如WTL就有多處這樣的情形)的過程中遇到這種情況,可以把函數(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的新特性
責任編輯:楊鵬飛 來源: IT專家網(wǎng)論壇
相關推薦

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++應用程序

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-01-20 13:52:19

2010-03-24 09:06:02

Visual Stui

2011-05-13 15:31:24

VC++

2011-07-14 22:04:16

VC++

2010-03-04 10:04:10

Linux動態(tài)庫

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++應用程序

2013-06-17 10:37:54

產(chǎn)品設計移動設計產(chǎn)品規(guī)劃
點贊
收藏

51CTO技術棧公眾號