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

天下

記錄修行的印記

C++類中模板函數的特化

C++類中模板函數的特化

最近在使用在使用模板特化 寫一段程序時發現一個奇怪的問題,比如像如下代碼:

     #include 
<iostream>
using namespace std;
class CMyClass
{
public:
     template 
<typename T>
     
struct test
     { 
         T i;
     };

     template 
<>
     
struct test<long>
     {
         unsigned 
long i;
     };
};

int main(void)
{
     CMyClass::test
<int> test1;
     CMyClass::test
<long> test2;
     CMyClass::test
<char> test3;

     cout 
<< "typeid(test1.i) is " << typeid(test1.i).name() << endl;
     cout 
<< "typeid(test2.i) is " << typeid(test2.i).name() << endl;
     cout 
<< "typeid(test3.i) is " << typeid(test3.i).name() << endl;

     
return 0;
}

這段代碼在Linux下的GCC 
3.4.3下無法編譯通過,編譯時提示錯誤:

xxx.cpp:
12: error: invalid explicit specialization before '>' token
xxx.cpp:
12: error: explicit specialization in non-namespace scope `class CMyClass'

但在VC6和VC8下都可以編譯通過。

 

后翻閱資料,發現有人提到,C
++標準中規定,嵌套類模板在類的定義中不允許被顯示特化聲明,只允許偏特化(“Explicit template specialization is forbidden for nested classes ”,“As partial template specialization is not forbidden ”),比如,這樣就可以:

     
#include 
<iostream>
using namespace std;

class CMyClass
{
public:
     template 
<typename T, typename S = void>
     
struct test
     {
         T i;
     };
     template 
<typename S>
     
struct test<long, S>
     {
         unsigned 
long i;
     };
};
int main(void)
{
     CMyClass::test
<int> test1;
     CMyClass::test
<long> test2;
     CMyClass::test
<char> test3;

     cout 
<< "typeid(test1.i) is " << typeid(test1.i).name() << endl;
     cout 
<< "typeid(test2.i) is " << typeid(test2.i).name() << endl;
     cout 
<< "typeid(test3.i) is " << typeid(test3.i).name() << endl;

     
return 0;

}

在上面這段代碼使用一個無用的模板參數來實現以偏特代替特化,從而化解了這個問題。至于為什么VC下能夠正常編譯,網上的資料說是VC不符合標準 (“MSVC 
is wrong in this case and g++ correct”),不過這點我尚未在C++標準中找到明文依據。

但是這樣一來就有個問題,偏特化在VC6下是用BUG的,無法正常使用,也就是說出來的代碼將無法兼容VC6。對于VC6這樣落伍的編譯器,兼容它 是沒有太大的必要,但是回頭想想,難道要在定義嵌套類模板的特化,就不行了么?必須使用偏特化來代替么?C
++對此是如何規定的呢?翻閱相關資料后,我找 到了答案--要把特化的代碼寫在類定義的外面(要寫在namespace下),如第一段代碼應該寫成這樣:

     
#include 
<iostream>
using namespace std;

class CMyClass
{
public:
     template 
<typename T>
     
struct test
     {
         
int i;
     };
};
template 
<>
struct CMyClass::test<long>
{
     
long i;
};

int main(void)
{
     CMyClass::test
<int> test1;
     CMyClass::test
<long> test2;
     CMyClass::test
<char> test3;

     cout 
<< "typeid(test1.i) is " << typeid(test1.i).name() << endl;
     cout 
<< "typeid(test2.i) is " << typeid(test2.i).name() << endl;
     cout 
<< "typeid(test3.i) is " << typeid(test3.i).name() << endl;

     
return 0;
}

這樣修改后,就可以在GCC下編譯通過了,同時,VC6,VC8也都能編譯通過!

總結一下吧:
在C
++中,如果要對嵌套類模板進行特化,則要么使用偏特化來替代特化(增加一個無用的模板參數),要么將 特化代碼放在類定義之外。

同樣的,非模板函數具有最高的優先權




轉自:http://jeffreyloo.blog.163.com/blog/static/12176167020106171424608/

posted on 2013-06-26 11:51 天下 閱讀(2614) 評論(0)  編輯 收藏 引用 所屬分類: C/C++C++模板

<2013年6月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

導航

統計

常用鏈接

留言簿(4)

隨筆分類(378)

隨筆檔案(329)

鏈接

最新隨筆

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美刺激午夜性久久久久久久| 国产麻豆精品视频| 一区二区三区**美女毛片| 欧美承认网站| 欧美激情第一页xxx| 亚洲第一黄色网| 欧美韩日一区二区| 亚洲日本va午夜在线电影| 亚洲免费观看在线观看| 在线亚洲精品福利网址导航| 亚洲一区二区免费| 欧美专区日韩视频| 欧美黄色一区| 国产精品美女久久久久av超清 | 美女视频黄a大片欧美| 亚洲一二三区在线| 亚洲网站视频福利| 亚洲综合色丁香婷婷六月图片| 午夜精品一区二区三区在线视| 久久久久网站| 日韩视频一区二区三区在线播放免费观看 | 欧美日韩免费精品| 国产亚洲精品久久久久婷婷瑜伽| 有码中文亚洲精品| 中文亚洲欧美| 牛牛精品成人免费视频| 99re66热这里只有精品4| 久久国产精品久久国产精品| 欧美高清视频一区| 激情久久一区| 亚洲一区二区三区四区视频| 久久av最新网址| 亚洲美女少妇无套啪啪呻吟| 久久九九精品99国产精品| 欧美午夜电影完整版| 国产午夜精品一区二区三区欧美 | 亚洲一区亚洲| 欧美丰满高潮xxxx喷水动漫| 亚洲专区一二三| 欧美激情一区二区三区在线| 国产婷婷色综合av蜜臀av| 亚洲素人在线| 欧美激情小视频| 欧美在线免费| 国产精品夜夜夜| 一本一本久久a久久精品综合妖精| 久久se精品一区精品二区| 亚洲日韩欧美一区二区在线| 久久精品一区二区国产| 国产精品一区在线观看| 亚洲天堂第二页| 亚洲激情在线| 麻豆精品视频| 红桃视频亚洲| 久久久人成影片一区二区三区观看 | 亚洲欧美日韩国产综合在线 | 亚洲高清一区二| 午夜精品久久久久久99热软件| 久久九九免费| 国产精品中文字幕欧美| 一区二区三区不卡视频在线观看| 久久亚洲影音av资源网| 狂野欧美激情性xxxx欧美| 韩国一区二区三区美女美女秀| 久久久国产一区二区| 久久久久久久一区二区三区| 亚洲九九精品| 久久精品成人欧美大片古装| 在线日韩av| 亚洲欧美在线另类| 99国产精品久久久久久久| 一区二区三区四区五区视频| 国产色产综合色产在线视频 | 欧美性久久久| 欧美不卡一卡二卡免费版| 欧美精品激情blacked18| 这里只有精品在线播放| 国产精品高潮呻吟久久av黑人| 午夜久久美女| 国产午夜精品久久久久久久| 日韩亚洲欧美成人| 亚洲在线免费视频| 欧美精品一区二区视频 | 欧美国产欧美综合| 裸体一区二区三区| 伊人婷婷欧美激情| 亚洲免费成人av| 久久久久久久高潮| av成人毛片| 国产精品久久久久久久久久尿| 亚洲午夜伦理| 亚洲国产精品t66y| 欧美伊久线香蕉线新在线| 亚洲激情欧美激情| 欧美大成色www永久网站婷| 噜噜噜久久亚洲精品国产品小说| 国产一区二区三区在线观看免费| 亚洲一区二区三区免费观看 | 国产精品久久久久久超碰| 亚洲一区3d动漫同人无遮挡| 久久亚洲综合| 亚洲欧美日韩网| 亚洲日韩欧美视频一区| 欧美亚洲第一区| 欧美在线日韩在线| 日韩视频在线观看| 欧美电影免费观看高清完整版| 在线亚洲美日韩| 亚洲国产成人av| 国产精品一区久久久久| 久久在线91| 亚洲国产精品va在看黑人| 国产精品一区=区| 欧美一区日韩一区| 亚洲精品中文字幕有码专区| 欧美一级理论片| 日韩一区二区免费高清| 伊人蜜桃色噜噜激情综合| 国产精品入口66mio| 免费日韩精品中文字幕视频在线| 一本色道久久99精品综合| 免费一级欧美片在线观看| 欧美在线精品一区| 午夜精品久久久久久久久久久久久| 亚洲日本欧美日韩高观看| 欧美激情精品久久久久久大尺度 | 欧美一级专区| 亚洲一级电影| 久久福利资源站| 久久另类ts人妖一区二区| 浪潮色综合久久天堂| 久久久水蜜桃av免费网站| 久久精品国产成人| 久久裸体艺术| 亚洲精品1区| 美女久久网站| 亚洲欧洲一区二区在线观看| 亚洲人成免费| 久久都是精品| 欧美日韩伊人| 国产综合久久久久久鬼色| 影音先锋日韩精品| 国产专区综合网| 日韩系列在线| 另类尿喷潮videofree | 亚洲欧洲一区二区在线播放| 一区二区免费在线视频| 久久精品国内一区二区三区| 蜜臀va亚洲va欧美va天堂| 亚洲精品国产视频| 欧美激情国产高清| 欧美黑人一区二区三区| 国产自产v一区二区三区c| 一本色道久久| 欧美电影资源| 久久免费国产精品| 狠狠色狠狠色综合系列| 久久久久国产精品一区三寸 | 欧美久久久久久蜜桃| 亚洲高清电影| av成人老司机| 免费毛片一区二区三区久久久| 国产日本欧洲亚洲| 亚洲高清久久网| 久久精品动漫| 久久精品免费看| 国产农村妇女毛片精品久久莱园子 | 亚洲视频图片小说| 夜夜躁日日躁狠狠久久88av| 久久天堂精品| 国内揄拍国内精品少妇国语| 亚洲视频第一页| 老司机免费视频一区二区三区| 亚洲欧美日韩精品久久| 国产精品免费一区豆花| 亚洲天堂免费在线观看视频| 欧美电影在线观看| 久久久久久欧美| 亚洲国产精品v| 亚洲高清网站| 欧美精品色一区二区三区| 欧美午夜免费影院| 亚洲一区国产| 午夜精品国产| 亚洲第一精品久久忘忧草社区| 欧美成人免费在线视频| 久久午夜激情| 国产欧美精品一区二区色综合| 性色av一区二区怡红| 久久久久免费视频| 亚洲精品久久久久久久久久久久久 | 国产精品黄色在线观看| 欧美一区二区在线播放| 欧美国产亚洲视频| 欧美一区二区三区成人| 老鸭窝毛片一区二区三区| 亚洲午夜未删减在线观看| 久久婷婷蜜乳一本欲蜜臀| 精品电影一区| 99国产精品视频免费观看|