<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      讓gcc支持成員函數模板的trick

      讓gcc支持成員函數模板的trick

      羅朝輝 (http://www.rzrgm.cn/kesalin/)

      本文遵循“署名-非商業用途-保持一致”創作公用協議
       
      gcc 4.7.3 不支持成員函數模板特化。如下代碼:
       
      #ifndef __MEMFUNTEMPLATE_H__
      #define __MEMFUNTEMPLATE_H__
      
      #include <stdio.h>
      
      class Base {};
      class Derived : public Base {};
      
      struct Functor {
          template <typename T> void function() {
              printf(" Primary template....\n");
          }
      
          template<>
          void function<int>(){
              printf(" Specialization for int....\n");
          }
      
          template<> void function<Base *>() {
              printf(" Specialization for Base *....\n");
          }
      };
      
      class Tester {
      public:
          static void DoTest()
          {
              Functor functor;
              functor.function<char>();
              functor.function<int>();
              functor.function<Base *>();
              functor.function<Derived *>();
          }
      };
      
      #endif // __MEMFUNTEMPLATE_H__

       

      在 VS2010 中編譯運行是沒有問題的,但在 gcc 4.7.3下,編譯都通不過:

      ../src/MemFunTemplate.h:21:14: error: explicit specialization in non-namespace scope ‘struct Functor’
      ../src/MemFunTemplate.h:22:24: error: template-id ‘function<int>’ in declaration of primary template
      ../src/MemFunTemplate.h:26:14: error: explicit specialization in non-namespace scope ‘struct Functor’
      ../src/MemFunTemplate.h:26:38: error: template-id ‘function<Base*>’ in declaration of primary template
      ../src/MemFunTemplate.h:26:21: error: ‘void Functor::function()’ cannot be overloaded
      ../src/MemFunTemplate.h:22:10: error: with ‘void Functor::function()’
      ../src/MemFunTemplate.cpp: In function ‘int main()’:
      ../src/MemFunTemplate.cpp:17:2: error: ‘DoTest’ is not a member of ‘Functor’
      

       

      為了達到近似成員函數模板特化的效果,可以利用成員函數主模板以及重載函數來實現:

      /*
       * MemFunTemplate.h
       *
       *  Created on: Jul 12, 2013
       *      Author: http://blog.csdn.net/kesalin/
       */
      
      #ifndef MEMFUNTEMPLATE_H_
      #define MEMFUNTEMPLATE_H_
      
      #include <stdio.h>
      
      template<typename T>
      struct DummyIdentity {
          typedef T type;
      };
      
      class Base {};
      class Derived : public Base {};
      
      struct Functor {
          template <typename T> void function() {
              function(DummyIdentity<T>());
          }
      
      private:
      
          template <typename T>
          void function(DummyIdentity<T>) {
              printf(" Primary template DummyIdentity<T>....\n");
          }
      
          void function(DummyIdentity<int>) {
              printf(" overload function for DummyIdentity<int>....\n");
          }
      
          void function(DummyIdentity<Base *>) {
              printf(" overload function for DummyIdentity<Base *>....\n");
          }
      };
      
      class Tester {
      public:
          static void DoTest()
          {
              Functor functor;
              functor.function<char>();
              functor.function<int>();
              functor.function<Base *>();
              functor.function<Derived *>();
          }
      };
      
      #endif /* MEMFUNTEMPLATE_H_ */

       

      調用 DoTest() 運行結果如下:

       Primary template DummyIdentity<T>....
       overload function for DummyIdentity<int>....
       overload function for DummyIdentity<Base *>....
       Primary template DummyIdentity<T>....

       

      注意:

      VS2010 版本的代碼,模板形參為 T,在實例化不會進行隱式類型轉換。即用 Derived * 當作實參調用的是主模板,而不是 Base * 特化版本

      而在 gcc  下,模板形參雖然也為T,但影響重載決議的 function 參數為:DummyIdentity<T>,用不同的實際參數實例化該模板,得到的是一堆重載函數。因此用 Derived * 當作實參時,調用的函數自然就是實例化的 void function(DummyIdentity<T>)了。

       
      posted @ 2013-07-12 21:59  飄飄白云  閱讀(2039)  評論(0)    收藏  舉報
      本博客遵循 Creative Commons License “署名-非商業用途-保持一致”創作共用協議。 與我聯系
      主站蜘蛛池模板: 国产欧美日韩综合精品一区二区| 国产一区二区av天堂热| 国产午夜精品福利91| 国产边打电话边被躁视频| 99在线视频免费观看| 国产亚洲av夜间福利香蕉149 | 国产片AV国语在线观看手机版| 人妻少妇偷人作爱av| 午夜福利影院不卡影院| 国产小视频一区二区三区| 国产羞羞的视频一区二区| 又粗又大又硬又长又爽| 亚洲高清国产拍精品熟女| 高清自拍亚洲精品二区| 美女自卫慰黄网站| 欧洲精品码一区二区三区| 4hu44四虎www在线影院麻豆| 日韩在线视频网| 国偷自产视频一区二区久| 日韩 一区二区在线观看| 国产一区二区四区不卡| 国内少妇偷人精品免费| 九九热在线视频只有精品| 久久婷婷大香萑太香蕉av人| 伊人欧美在线| 精品无码日韩国产不卡av| 一区二区精品久久蜜精品| 玩弄漂亮少妇高潮白浆| 精品久久久久久成人AV| 小伙无套内射老熟女精品| 天堂网在线.www天堂在线资源| 日韩人妻久久精品一区二区| 樟树市| 99热久久这里只有精品| 亚洲AV成人一区国产精品| 国产精品∧v在线观看| 色伦专区97中文字幕| 暖暖 免费 高清 日本 在线观看5| 亚洲色婷婷久久精品av蜜桃久久 | 欧美成年性h版影视中文字幕| 国产精品乱码久久久久久小说|