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

羅朝輝(飄飄白云)

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

  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 羅朝輝 閱讀(6362) 評論(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>
            亚洲一区国产精品| 99精品欧美一区| 亚洲卡通欧美制服中文| 国产一区二区三区久久悠悠色av| 国产美女精品在线| 国产欧美日韩不卡免费| 国产一区二区三区精品欧美日韩一区二区三区| 国产精品视频一二三| 国产性做久久久久久| 好看的av在线不卡观看| 亚洲国产视频一区| 一区二区三区日韩欧美| 午夜精品久久99蜜桃的功能介绍| 午夜免费久久久久| 可以免费看不卡的av网站| 亚洲电影自拍| 99精品视频一区| 欧美呦呦网站| 欧美国产一区二区| 国产视频亚洲| 一区二区三区视频在线观看| 久久国产66| 亚洲免费成人| 久久免费黄色| 欧美小视频在线观看| 一色屋精品视频在线观看网站| 日韩亚洲综合在线| 久久精品亚洲| 99国产一区| 蜜月aⅴ免费一区二区三区| 国产精品美女视频网站| 91久久夜色精品国产九色| 欧美亚洲免费| 日韩一级在线| 另类国产ts人妖高潮视频| 国产精品videosex极品| 91久久久久久国产精品| 久久久久久久一区二区| 一本一本久久a久久精品综合妖精| 久久精品一区二区三区不卡| 欧美少妇一区二区| 亚洲免费观看高清完整版在线观看熊 | 久久深夜福利免费观看| 国产精品福利网站| 91久久视频| 麻豆精品在线观看| 午夜精品久久99蜜桃的功能介绍| 欧美巨乳在线| 亚洲性视频网站| 日韩视频欧美视频| 亚洲欧洲日韩女同| 欧美日韩一区综合| 欧美调教vk| 国产主播一区二区三区四区| 国产三级欧美三级| 亚洲淫性视频| 亚洲人体偷拍| 开心色5月久久精品| 91久久久在线| 亚洲精品中文字幕有码专区| 欧美日韩亚洲一区| 欧美中文字幕在线观看| 欧美一区二区三区成人| 国产毛片精品视频| 你懂的成人av| 欧美日韩国产大片| 久久都是精品| 国产在线拍揄自揄视频不卡99| 亚洲一区二区三区视频| 亚洲在线观看视频| 午夜免费在线观看精品视频| 在线成人激情视频| 亚洲午夜电影在线观看| 亚洲精品中文字| 欧美亚洲视频在线观看| 亚洲二区在线观看| 欧美一区二区精品| 亚洲视频在线二区| 欧美黄色日本| 久久色在线观看| 最新国产乱人伦偷精品免费网站| 亚洲日本成人| av72成人在线| 在线播放日韩欧美| 亚洲免费中文字幕| 99视频在线精品国自产拍免费观看 | 99热免费精品在线观看| 国产精品99久久久久久久vr | 亚洲人成网站影音先锋播放| 国内外成人免费激情在线视频网站| 欧美国产免费| 中文在线不卡视频| 亚洲毛片在线免费观看| 在线电影国产精品| 欧美不卡视频一区| 欧美va天堂| 亚洲精品在线免费| 欧美人与禽猛交乱配| 亚洲免费播放| 欧美亚洲一区三区| 精品1区2区| 国产精品sss| 老司机免费视频一区二区三区| 亚洲二区免费| 亚洲摸下面视频| 国产日韩欧美麻豆| 欧美激情1区2区3区| 亚洲精品一区二区三区av| 翔田千里一区二区| 亚洲美女av网站| 尤物在线精品| 国产午夜久久久久| 欧美日韩中文字幕日韩欧美| 久久久人成影片一区二区三区| 亚洲精品在线免费| 美女性感视频久久久| 亚洲一区二区在线看| 欧美成人一区二区在线| 久久成人18免费网站| 亚洲人成人77777线观看| 欧美在线网站| 亚洲免费影视第一页| 亚洲电影激情视频网站| 国产毛片一区| 国产精品一区二区久久久久| 欧美日韩免费网站| 国产精品久久国产精品99gif| 蜜臀久久久99精品久久久久久| 欧美在线视频a| 夜夜嗨av色一区二区不卡| 日韩视频三区| 日韩一二在线观看| 一道本一区二区| 亚洲性线免费观看视频成熟| 亚洲日本黄色| 午夜精品理论片| 亚洲视频在线播放| 久久国产精品久久国产精品| 亚洲欧美变态国产另类| 国产精品日韩久久久| 亚洲性线免费观看视频成熟| 亚洲视频导航| 欧美在线综合视频| 欧美成人一区在线| 欧美日韩伦理在线免费| 国产日本欧美一区二区三区在线 | 亚洲国产精品99久久久久久久久| 亚洲毛片播放| 欧美成人精品福利| 国产精品一二一区| 99re6这里只有精品视频在线观看| 欧美在线黄色| 欧美精品午夜视频| 激情成人av在线| 校园春色国产精品| 99re66热这里只有精品3直播| 久久精品动漫| 国产精品美腿一区在线看| 亚洲欧洲精品成人久久奇米网 | 欧美精品免费播放| 国产欧美精品一区二区色综合| 一本色道久久综合亚洲精品高清 | 日韩视频在线一区二区三区| 亚洲精品一区二区三区av| 欧美sm视频| 欧美成人一品| 一区二区av在线| 亚洲乱码精品一二三四区日韩在线| 久久综合给合| 亚洲黄网站在线观看| 亚洲黄色成人网| 欧美视频免费在线| 亚洲深夜影院| 欧美在线免费| 亚洲欧洲精品成人久久奇米网 | 亚洲主播在线观看| 亚洲大胆人体在线| 欧美国产日韩一区二区三区| 精品不卡一区| 亚洲第一福利在线观看| 国产精品福利久久久| 欧美破处大片在线视频| 黄色精品免费| 亚洲理论在线| 18成人免费观看视频| 99亚洲精品| 国产人妖伪娘一区91| 一区二区高清在线观看| 久久久噜噜噜| 亚洲一区观看| 男男成人高潮片免费网站| 亚洲欧洲精品一区二区三区不卡 | 国产精品色婷婷| 亚洲激情在线观看| 欧美日韩一区在线播放| 美乳少妇欧美精品| 国产精品最新自拍| 国产精品99久久久久久有的能看 | 欧美一区亚洲| 亚洲欧美日韩国产|