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

MyMSDN

MyMSDN記錄開發(fā)新知道

關(guān)于C++ Template分離頭文件和定義所產(chǎn)生的錯誤

編譯錯誤

如圖所示的代碼出現(xiàn)了如圖所示的錯誤,誰能解釋一下是為什么呢?

雖然在最后include進(jìn)了cpp文件,而且這種做法也在C++ Primer中也是正確的(難道是標(biāo)準(zhǔn)和現(xiàn)實(shí)的差距?)。將代碼稍微變動,并將cpp部分的內(nèi)容移到.h文件中的include位置即可正確編譯。

編譯正確

posted on 2009-02-22 06:05 volnet 閱讀(4356) 評論(20)  編輯 收藏 引用

評論

# re: 關(guān)于C++ Template分離頭文件和定義所產(chǎn)生的錯誤 2009-02-22 09:12 huoxd

我記著這是個老問題了,的確不少的參考書中這么說過,但是要注意兩點(diǎn):
1.這樣的分離只是文件層面的分離,并非是傳統(tǒng)的模塊之間只見接口,不見實(shí)現(xiàn)的分離,做為沒用動態(tài)特性的靜態(tài)語言,C++把模板的實(shí)現(xiàn)封裝成二進(jìn)制是不可能的,這種編程技巧只是為了讓代碼瀏覽起來感覺更規(guī)范.
2.不同的編譯器對模板的實(shí)現(xiàn)還沒有完全按照標(biāo)準(zhǔn)來支持,所以產(chǎn)生錯誤了不奇怪.  回復(fù)  更多評論   

# re: 關(guān)于C++ Template分離頭文件和定義所產(chǎn)生的錯誤 2009-02-22 09:14 huoxd

是"沒有動態(tài)特性"的,打錯了,不好意思  回復(fù)  更多評論   

# re: 關(guān)于C++ Template分離頭文件和定義所產(chǎn)生的錯誤 2009-02-22 12:04 空明流轉(zhuǎn)

在源代碼級別,模板是可以有一定程度的分離的.

我舉個例子

//lib.h
template <class T> const T& return_itself(const T& val);

//lib.cpp
template <class T> const T& return_itself(const T& val){ return val; }
void instantiate_return_itself(){
//this is not executing factually.
return_itself((int)0);
}

//app.cpp
#include "lib.h"

int main(){
return_itself((int)0); // OK
return_itself(0.0f); // no compiler error happens but some link errors
}  回復(fù)  更多評論   

# re: 關(guān)于C++ Template分離頭文件和定義所產(chǎn)生的錯誤 2009-02-22 12:37 huoxd

樓上說的是模板函數(shù),的確可以分離,但模板類就不太容易了  回復(fù)  更多評論   

# re: 關(guān)于C++ Template分離頭文件和定義所產(chǎn)生的錯誤 2009-02-22 18:23 Dancefire

樓主,你的問題其實(shí)很簡單。

你是不是把foo.cpp也放進(jìn)Visual C++的項(xiàng)目里了?如果是的話,這樣會導(dǎo)致foo.cpp的編譯,這個編譯會導(dǎo)致T Foo<T>::GetInstance(void)被編譯實(shí)現(xiàn)。當(dāng)繼續(xù)編譯main.cpp的時候,就會報告,T Foo<T>::GetInstance(void)已經(jīng)有一個實(shí)例了。

解決辦法很簡單,把foo.cpp移出工程就可以了。只要物理上foo.h的同目錄存在foo.cpp這個文件就可以了。因?yàn)閒oo.cpp根本沒必要去編譯。甚至我都不建議你稱其為foo.cpp,不如叫什么foo_impl.hpp之類的文件名更合理些,這樣即使這個文件在工程里面也不回導(dǎo)致被編譯。  回復(fù)  更多評論   

# re: 關(guān)于C++ Template分離頭文件和定義所產(chǎn)生的錯誤 2009-02-22 19:36 chujun

Foo.cpp里改成:
#ifndef FOO_H_
#include "foo.h"
template<typename T> T Foo<T>::GetInstance() {
return instance;
}
#endif
可以試一下...  回復(fù)  更多評論   

# re: 關(guān)于C++ Template分離頭文件和定義所產(chǎn)生的錯誤 2009-02-22 20:57 yindf

Dancefire 的答案是對的,如果你自己寫makefile的話,肯定不能把foo.cpp編譯成foo.obj。

書上沒有說這一點(diǎn),但是你的IDE自動幫你makefile了,所以有些時候,自動化也有不好的地方呀。  回復(fù)  更多評論   

# re: 關(guān)于C++ Template分離頭文件和定義所產(chǎn)生的錯誤 2009-02-22 22:26 volnet

@Dancefire
的確,把foo.cpp移出項(xiàng)目外的話就可以順利編譯并執(zhí)行了!
但是在你的回答中,為什么會提到“當(dāng)繼續(xù)編譯main.cpp的時候……”,這是為什么呢?為什么非模板類型就可以?  回復(fù)  更多評論   

# re: 關(guān)于C++ Template分離頭文件和定義所產(chǎn)生的錯誤 2009-02-22 23:11 空明流轉(zhuǎn)

非模板類型的應(yīng)該也是不可以的。
還有就是,不僅僅是模板函數(shù),模板類一樣可以。  回復(fù)  更多評論   

# re: 關(guān)于C++ Template分離頭文件和定義所產(chǎn)生的錯誤 2009-02-22 23:15 volnet

@空明流轉(zhuǎn)
我說的可以是指在h中聲明,在cpp中定義,這顯然是可以的(也是標(biāo)準(zhǔn)的做法)
模板函數(shù)和模板類的確都存在如本文所述的問題,并且用Dancefire的方法,或者使用全部寫在.h文件中的方式,都是可以的。  回復(fù)  更多評論   

# re: 關(guān)于C++ Template分離頭文件和定義所產(chǎn)生的錯誤 2009-02-23 00:49 Dancefire

@volnet
呵呵,非模板類型的函數(shù)定義我們也不會需要在foo.h中include foo.cpp啊:)

在樓主的例子里面為了能夠讓定義和聲明分開,將聲明放到了foo.h中,而定義放到了foo.cpp中,這和非模板類型的函數(shù)是一樣的。但是可惜這么做是無法通過的,因?yàn)槟0孱愋秃瘮?shù)不能夠(由于沒有export支持)單獨(dú)編譯。為了讓編譯通過,樓主將foo.cpp給include進(jìn)了foo.h,這樣實(shí)際上是將兩個文件整合成一個文件了。這樣編譯就沒有問題了,但是得小心需要把foo.cpp分離出項(xiàng)目,因?yàn)樗豢梢员痪幾g;或者將其擴(kuò)展名從.cpp改為.hpp。

實(shí)在是不推薦樓主這么分開的寫,說實(shí)話這算不上是什么標(biāo)準(zhǔn)的做法,而且這樣并沒有太大的意義。如果非要分開,可以將定義后綴到聲明后面,在一個文件里。但是分開確實(shí)沒太大意義。可以研讀一下boost里面的做法。  回復(fù)  更多評論   

# re: 關(guān)于C++ Template分離頭文件和定義所產(chǎn)生的錯誤 2009-02-23 00:54 volnet

@Dancefire
原來你們說的是include foo.cpp

分開有一個好處就是可以成套地替換吧,雖然通常我們不這么做,但是卻從語法上支持了這么做。如果可以當(dāng)然好了,不行的話肯定是沒辦法的。  回復(fù)  更多評論   

# re: 關(guān)于C++ Template分離頭文件和定義所產(chǎn)生的錯誤 2009-02-23 00:57 volnet

@Dancefire
boost在C++中的地位是什么呢?一個工業(yè)庫?一個泛型標(biāo)準(zhǔn)?一個開源范例?它對C++學(xué)習(xí)有什么好處呢?  回復(fù)  更多評論   

# re: 關(guān)于C++ Template分離頭文件和定義所產(chǎn)生的錯誤 2009-02-23 01:17 Dancefire

@volnet
Boost可以稱其為是一套準(zhǔn)標(biāo)準(zhǔn)庫。它項(xiàng)目建立的目的之一就是為未來的C++標(biāo)準(zhǔn)庫提供候選方案,目前已經(jīng)有將近十個Boost庫成功的成為了C++標(biāo)準(zhǔn)預(yù)案。

它的優(yōu)勢很多,首先是代碼使用現(xiàn)代C++的語法,因此namespace, 異常, 模板之類的C++特性會被充分挖掘利用,代碼從設(shè)計、實(shí)現(xiàn)到文檔都具有了相當(dāng)高的水準(zhǔn)。另外,由于它使用的是標(biāo)準(zhǔn)C++語法編寫,因此它的可移植性非常的好。當(dāng)然,針對一些存在問題的編譯器,它也會進(jìn)行相應(yīng)的調(diào)整以盡量支持。

Boost這種優(yōu)良的庫,涵蓋的領(lǐng)域很廣,可以說是標(biāo)準(zhǔn)庫很好的補(bǔ)充。另外絕大多數(shù)Boost庫都不需要編譯鏈接,大部分的Boost庫僅僅include頭文件即可工作。我看到國內(nèi)很多人提到Boost的時候說它比較難以編譯安裝云云。其實(shí)沒必要編譯,絕大多數(shù)的庫僅僅是由頭文件組成的,只要include進(jìn)來就可以用了。

Boost是C++強(qiáng)有力的工具,學(xué)習(xí)C++,除了標(biāo)準(zhǔn)語法和STL外,Boost是必須熟悉的,否則,工程上很有可能會做一些Boost已經(jīng)實(shí)現(xiàn)很久的東西,除了重復(fù)開發(fā)外,而且你的代碼的質(zhì)量和可持續(xù)性比Boost差很遠(yuǎn),造成項(xiàng)目質(zhì)量的下降。  回復(fù)  更多評論   

# re: 關(guān)于C++ Template分離頭文件和定義所產(chǎn)生的錯誤 2009-02-23 01:22 volnet

@Dancefire
謝謝你對Boost做了詳細(xì)的介紹。
那么,學(xué)習(xí)Boost庫需要有哪些準(zhǔn)備工作?(假設(shè)從初學(xué)者開始)學(xué)習(xí)Boost庫又有哪些方法或者經(jīng)典的做法呢?(比如什么書,或者什么文檔)  回復(fù)  更多評論   

# re: 關(guān)于C++ Template分離頭文件和定義所產(chǎn)生的錯誤 2009-02-23 13:29 maosher

foo.h里面最下面倒數(shù)第二行

的#include   回復(fù)  更多評論   

# re: 關(guān)于C++ Template分離頭文件和定義所產(chǎn)生的錯誤 2009-02-23 13:34 volnet

@maosher
怎么了?  回復(fù)  更多評論   

# re: 關(guān)于C++ Template分離頭文件和定義所產(chǎn)生的錯誤 2009-02-23 16:22 陳梓瀚(vczh)

template特化是鏈接期不能解決的問題,因此必須放進(jìn).h,不要使用別扭的技巧來分離。其實(shí)直接寫在一個class{}里面反而漂亮得多。  回復(fù)  更多評論   

# re: 關(guān)于C++ Template分離頭文件和定義所產(chǎn)生的錯誤 2009-03-02 11:20 xcj

簡單的問題。把foo.cpp中#include "foo.h"那行刪除掉應(yīng)該就沒問題了。  回復(fù)  更多評論   

# re: 關(guān)于C++ Template分離頭文件和定義所產(chǎn)生的錯誤 2012-01-02 20:27 wzm

.cpp 的模板前面加個 export試試  回復(fù)  更多評論   


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


特殊功能
 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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精品久久久久久| 亚洲综合不卡| 亚洲一区二区三区四区中文 | 久久久久久久尹人综合网亚洲| 国产精品国产三级国产普通话三级| 免费日韩精品中文字幕视频在线| 久久免费的精品国产v∧| 欧美国产日韩在线| 欧美午夜精品伦理| 国一区二区在线观看| 中文亚洲欧美| 老司机一区二区三区| 日韩视频二区| 久久久久久久一区二区三区| 国产精品大片wwwwww| 狠狠色丁香婷综合久久| 亚洲精品日韩一| 欧美一站二站| 一区二区三区欧美视频| 久久亚洲一区二区三区四区| 欧美日韩亚洲高清一区二区| 狠色狠色综合久久| 久久精品三级| 久久激情网站| 国产综合在线视频| 久久久久综合网| 欧美亚洲在线观看| 欧美午夜影院| 亚洲一级免费视频| 亚洲国产精品成人| 免费看亚洲片| 99精品欧美一区二区三区综合在线| 久久久久久久久久久一区 | 欧美一区二粉嫩精品国产一线天| 亚洲精品一区二区三区樱花| 久久亚洲风情| 亚洲国产一区二区在线| 亚洲激情国产| 亚洲人成网站在线播| 欧美日韩国产免费| 亚洲午夜精品17c| 99视频一区二区| 国产精品免费看久久久香蕉| 亚洲自啪免费| 久久免费少妇高潮久久精品99| 亚洲成人资源| 一区二区免费在线视频| 狠狠色丁香久久婷婷综合丁香| 蜜臀av一级做a爰片久久| 免费一级欧美片在线观看| 中文高清一区| 蜜桃av综合| 久久久99爱| 国产精品高潮呻吟久久av无限| 久久久久久亚洲精品中文字幕| 噜噜噜躁狠狠躁狠狠精品视频| 在线一区二区视频| 久久精品免视看| 久久精品国产清高在天天线 | 猫咪成人在线观看| 国产伦精品免费视频| 91久久亚洲| 亚洲区一区二| 一区二区三区日韩欧美精品| 欧美aa国产视频| 免费一级欧美在线大片| 国产色视频一区| 欧美在线亚洲| 毛片基地黄久久久久久天堂| 国产亚洲欧洲一区高清在线观看| 亚洲综合第一页| 亚洲欧美日韩中文视频| 亚洲一区二区视频在线| 欧美精品免费在线| 欧美在线免费观看| 亚洲欧美日韩精品久久| 亚洲理论在线| 亚洲一区精品视频| 国产日韩亚洲欧美| 欧美xxx在线观看| 99视频在线精品国自产拍免费观看 | 久久久噜噜噜久久| 激情成人在线视频| 欧美wwwwww| 亚洲老板91色精品久久| 欧美一区二区在线视频| 国内精品久久久久久 | 久久精品官网| 久久久久久久久久久久久女国产乱| 国产一区二区三区黄| 美女啪啪无遮挡免费久久网站| 欧美激情精品久久久六区热门 | 亚洲一区二区免费| 国产精品高潮呻吟视频| 性做久久久久久免费观看欧美| 久久色在线观看| 亚洲欧洲av一区二区| 在线国产精品一区| 国产精品黄视频| 久久影视精品| 欧美在线关看| 国产精品爽黄69| 久热精品视频在线免费观看| 国产精品99久久久久久有的能看| 另类专区欧美制服同性| 午夜一区二区三区不卡视频| 亚洲免费在线播放| 欧美一区二区三区在线观看| 欧美一级成年大片在线观看| 欧美一区二区在线看| 久久激情婷婷| 亚洲激情社区| 亚洲午夜精品久久久久久浪潮 | 一区二区电影免费观看| 国内一区二区三区在线视频| 国产精品国产三级国产| 国产精品不卡在线| 国产欧美日韩在线| 国产色视频一区| 在线看不卡av| 一区二区三区产品免费精品久久75| 亚洲高清一二三区| 亚洲专区一二三| 欧美中文字幕在线| 免费亚洲电影在线观看| 日韩视频永久免费观看| 午夜激情综合网| 欧美jjzz| 国内精品久久久| 一本一道久久综合狠狠老精东影业| 日韩一区二区免费看| 久久久精品免费视频| 欧美激情一二三区| 午夜国产一区| 欧美午夜免费电影| 亚洲高清激情| 午夜久久99| 亚洲美女少妇无套啪啪呻吟| 久久精品成人一区二区三区| 欧美精品一区二区三区一线天视频| 国产精品成人播放| 久久久久久久97| 国产精品二区在线| 亚洲欧洲在线一区| 欧美fxxxxxx另类| 久久蜜桃资源一区二区老牛| 国产婷婷色一区二区三区| 亚洲午夜电影网| 国产精品一区二区三区久久久| 亚洲在线播放| 性久久久久久| 亚洲第一精品久久忘忧草社区| 久久婷婷激情| 另类综合日韩欧美亚洲| 亚洲精品国产精品乱码不99按摩 | 男人天堂欧美日韩| 蜜乳av另类精品一区二区| 在线观看欧美日本| 亚洲精品偷拍| 国产精品黄页免费高清在线观看| 在线视频你懂得一区二区三区| 99热精品在线| 1204国产成人精品视频| 欧美激情精品久久久久久黑人| 欧美日韩国产探花| 欧美伊久线香蕉线新在线| 久久理论片午夜琪琪电影网| 99精品久久久| 久久九九免费视频| 亚洲男女毛片无遮挡| 亚洲日本视频| 欧美日韩精品在线播放| 在线不卡中文字幕| 蜜桃视频一区| 国产精品第一区| 午夜精品久久久久久| 久久午夜激情| 性欧美1819性猛交| 欧美日韩国产首页在线观看| 久久综合色综合88| 欧美亚男人的天堂| 欧美激情一区二区三区高清视频| 欧美亚洲成人精品| 麻豆国产精品va在线观看不卡| 欧美一区二区高清| 欧美日韩美女一区二区| 牛夜精品久久久久久久99黑人| 国产精品国产亚洲精品看不卡15| 亚洲电影免费观看高清完整版在线 | 亚洲国产综合视频在线观看| 欧美日韩一区二区在线| 亚洲欧美日韩国产一区二区| 欧美大成色www永久网站婷| 免费一级欧美片在线播放| 亚洲美女啪啪| 欧美电影美腿模特1979在线看| 久久精品男女| 国产一区二区av| 久久久一二三|