青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

羅朝輝(飄飄白云)

關注嵌入式操作系統,移動平臺,圖形開發。-->加微博 ^_^

  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
  85 隨筆 :: 0 文章 :: 169 評論 :: 0 Trackbacks

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

羅朝輝 (http://m.shnenglu.com/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: <strong>explicit specialization in non-namespace scope</strong> ‘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 on 2013-07-12 22:04 羅朝輝 閱讀(6353) 評論(3)  編輯 收藏 引用 所屬分類: C/C++

評論

# re: 讓gcc支持成員函數模板的trick 2013-07-13 20:54 Marvin
從objective-c轉到c++了?  回復  更多評論
  

# re: 讓gcc支持成員函數模板的trick 2013-07-14 21:37 羅朝輝
@Marvin
哈哈,本就是從C++起家的~~  回復  更多評論
  

# re: 讓gcc支持成員函數模板的trick 2014-08-15 21:28 acmol
其實只需要
a->template b()就可以調用了。。
雖然我也不知道原因。  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲高清视频在线观看| 亚洲国产精品久久久久| 国产精品色午夜在线观看| 免费成人网www| 久久精品中文字幕一区| 久久男人资源视频| 久久视频在线视频| 久久亚洲捆绑美女| 久久在线91| 欧美午夜不卡| 国产精品丝袜白浆摸在线| 国产精品永久免费在线| 另类av导航| 亚洲精品视频啊美女在线直播| 一区二区黄色| 麻豆成人综合网| 国产精品a久久久久| 国模套图日韩精品一区二区| 在线观看国产欧美| 午夜精品www| 亚洲电影免费| 久久色中文字幕| 国产日韩成人精品| 亚洲一区免费| 亚洲国产欧洲综合997久久| 亚洲欧美国产三级| 国产精品入口66mio| 亚洲精品乱码视频| 欧美福利专区| 久久xxxx| 狠狠色狠狠色综合日日五| 欧美一级视频免费在线观看| 亚洲精选中文字幕| 欧美亚一区二区| 午夜国产一区| 亚洲免费人成在线视频观看| 欧美午夜电影在线观看| 亚洲影院一区| 午夜久久资源| 狠狠色狠狠色综合日日tαg| 欧美wwwwww| 欧美经典一区二区| 在线午夜精品自拍| 国产亚洲一区在线| 久久网站热最新地址| 欧美国产日韩一区二区三区| 久久国产加勒比精品无码| 国产亚洲人成a一在线v站| 欧美亚洲视频一区二区| 久久av红桃一区二区小说| 亚洲日本激情| 亚洲一区影院| 亚洲免费福利视频| 亚洲视频国产视频| 狠狠色狠狠色综合人人| 亚洲国产精品久久久| 国产日韩精品在线| 亚洲狠狠丁香婷婷综合久久久| 欧美午夜激情小视频| 美女成人午夜| 国产精品久久7| 亚洲人成在线观看一区二区| 国产精品毛片高清在线完整版| 欧美a级理论片| 国产一区二区久久| 亚洲一区日韩| 亚洲线精品一区二区三区八戒| 亚洲美女少妇无套啪啪呻吟| 久久aⅴ国产紧身牛仔裤| 性欧美1819sex性高清| 亚洲欧美亚洲| 欧美日本久久| 一区二区三区欧美在线观看| 亚洲成色www久久网站| 久久裸体艺术| 鲁鲁狠狠狠7777一区二区| 在线看片一区| 欧美成人精品不卡视频在线观看| 欧美激情第4页| 亚洲美女中出| 国产精品福利久久久| 亚洲欧美乱综合| 蜜桃av综合| 欧美日韩成人综合在线一区二区| 美女图片一区二区| 在线亚洲美日韩| 欧美性色综合| 欧美一区二区三区喷汁尤物| 麻豆国产精品777777在线| 亚洲国产小视频| 欧美日韩精品系列| 午夜精品一区二区三区在线视 | 亚洲视频1区| 免费久久99精品国产自| 亚洲一区欧美激情| 樱花yy私人影院亚洲| 国产精品久久久久久五月尺| 欧美伊人久久久久久午夜久久久久| 欧美大片免费看| 久久久久久综合网天天| 在线综合亚洲欧美在线视频| 国产在线拍偷自揄拍精品| 国产精品国产三级国产普通话99| 欧美专区福利在线| 性欧美大战久久久久久久久| 亚洲精品美女在线| 欧美高清视频在线观看| 麻豆精品一区二区综合av| 亚洲一区影音先锋| 在线视频精品一| 亚洲一区久久| 国产午夜一区二区三区| 欧美在线首页| 欧美在线免费看| 亚洲精品社区| 伊人久久亚洲美女图片| 亚洲一区二区三区激情| 欧美成人精品h版在线观看| 亚洲欧美日韩在线播放| 欧美人在线观看| 校园春色国产精品| 欧美激情网友自拍| 欧美激情亚洲另类| 欧美日韩国产在线播放网站| 欧美视频在线观看视频极品| 欧美视频一区在线观看| 国产日韩精品在线观看| 亚洲国产精品黑人久久久| 亚洲国产日韩欧美在线图片| 一区二区三区日韩| 久久综合九色综合欧美狠狠| 亚洲精品一二三区| 久久一区二区三区av| 欧美日韩另类在线| 激情另类综合| 性色av一区二区怡红| 欧美不卡视频一区发布| 亚洲一区二区三区在线播放| 欧美大片va欧美在线播放| 国产亚洲精品福利| 欧美亚洲免费高清在线观看| 亚洲韩国精品一区| 毛片av中文字幕一区二区| 国产三级欧美三级日产三级99| 亚洲免费黄色| 欧美黄色免费| 久久超碰97人人做人人爱| 国产一区在线免费观看| 蜜臀久久99精品久久久久久9| 欧美一区二区三区免费观看| 国产亚洲欧美在线| 欧美h视频在线| 欧美高清日韩| 欧美一区二区三区免费视频| 亚洲与欧洲av电影| 黄色精品免费| 亚洲国产成人av好男人在线观看| 六月天综合网| 亚洲主播在线观看| 久久久人成影片一区二区三区观看 | 亚洲视频大全| 香蕉国产精品偷在线观看不卡| 国内精品免费在线观看| 91久久在线| 国产午夜精品久久| 亚洲国产婷婷综合在线精品| 国产精品久久国产愉拍| 久久久久久久高潮| 欧美日韩三区| 欧美激情黄色片| 国产婷婷色一区二区三区| 99av国产精品欲麻豆| 亚洲免费av网站| 欧美久久综合| 国产一区二区丝袜高跟鞋图片| 一区二区视频免费完整版观看| 中文国产一区| 久久米奇亚洲| 亚洲人屁股眼子交8| 国产精品入口尤物| 久久午夜激情| 亚洲欧美三级伦理| 亚洲激情综合| 久久久亚洲一区| 亚洲精品日韩在线观看| 欧美人与禽猛交乱配| 亚洲网站在线播放| 久久天天狠狠| 亚洲高清视频在线| 欧美日韩综合| 久久久久久网| 亚洲精品国精品久久99热| 亚洲一级特黄| 国内偷自视频区视频综合| 欧美大片一区二区三区| 亚洲一区二区黄色| 亚洲国产精品毛片| 久久免费视频网| 亚洲一区二区三区久久| 在线成人黄色|