c 中的template的問題

時間 2021-09-12 00:10:22

1樓:匿名使用者

實現模板例項化是編譯器的編譯期行為,編譯期按不同型別引數例項化模板,並且目前而言編譯器一般不會有通用且有效的優化行為(因為模板中的型別引數自由度很高,編譯器無法判斷哪個類或函式的模板例項化版本是不需要的而可以用另一些版本代替)。因此如果呼叫的不同型別引數數量比較多,的確會造成很明顯的**膨脹導致最終目標檔案體積明顯增加。如果要減少目標檔案體積,可以限制呼叫的型別引數的例項數,例如在不同的類之間儘可能使用繼承而不是直接當作相互無關的模板型別引數(不過這樣可能會略損失執行期效能,尤其是使用虛繼承時;另外物件導向範型相對於泛型而言,執行期限制更多,靈活性略差,有時候可能不得不多寫一些重複**)。

至於函式呼叫是目標**的執行期行為,目標**已經生成好了(由於是本機**,不會儲存型別等元資訊),和模板無關(模板在編譯早期後就可以當作不存在了)。

====

[原創回答團]

2樓:花香人間

編譯時會生成,但一個模板引數只生成一份**,

跟呼叫沒有關係。

3樓:陳學陽

。。。吧template後面那個分號去掉就行了。

如果對您有幫助,請記得采納為滿意答案,謝謝!祝您生活愉快!

vaela

c++中的template是做什麼用的

4樓:

template 模板呀,就是採用型別作引數編出一個類或函式的模子,傳入型別後,就可以得到一大堆你想要的功能幾乎一樣的類和函式了,呵呵

5樓:

c++中模板的宣告和定義的位置一定要小心處理, 否則在連結時會出現"無法解析某某函式或類"的錯誤。

函式模板的一般定義形式:

template < 型別形式參數列 > 返回型別 functionname( 形式參數列 )

說明:⒈ < 型別形式參數列 > 可以包含基本資料型別,也可以包含類型別。若是類型別,則須加字首 class 。

⒉這樣的函式模板定義不是一個實實在在的函式,編譯系統不為其產生任何執行**。該定義只是對函式的描述,表示它每次能單獨處理在型別形式參數列中說明的資料型別。

6樓:匿名使用者

這是c++中支援抽象的一種方式,稱為模板。比如定義一個類point,座標x,y的值的資料型別可能因問題而異,這時可以使用模板機制,將類的宣告中可能出現的資料型別引數化,僅用符號t代表,並在類宣告的前面或每個成員函式的實現程式前面加一條型別引數化語句:

template

程式內部可以直接使用引數t定義相應的變數的資料型別,比如class point

實際使用時,可以用語句

pointa;

建立一個類point的例項,這個例項用整型int來給出x,y的值。

c++ 高手求解:template < int n> 的具體用法與講解? 如果只是講template < typename n> 就不要回答了? 5

7樓:匿名使用者

模板不就是一個公式嗎? 對不?

你說的這種用法就是,只能傳常數

例子template

class aaa;

c++template模板問題

8樓:兔子和小強

array是int型別,array[i]只能做右值,用來表示第i行的首地址,而不能作為左值。

你應該使用指標陣列來處理,即將array宣告成int *型別。

9樓:匿名使用者

你的t沒實現operator=吧

c++ 模板類 後面每個方法前的template 有什麼意義 對每個方法有什麼影響?

10樓:匿名使用者

c++集合了過程式

語言,通用語言,面嚮物件語言的眾多特點。模板是通用語言的特性,模板又叫引數化型別(parametrized types)。

模板的定義。以下是模板定義的一般格式:

template //class 也可以換成typename,後者是新來的。

void swap(any &a,any &b)

利用模板機制可以顯著減少冗餘資訊,能大幅度地節約程式**,進一步提高物件導向程式的可重用性和維護性。

在使用過程中,注意的問題:

(1)在template語句與函式模板定義語句之間不允許有別的語句。

template

int i; // 錯誤,不允許插入別的語句

t max(t x,t y)

(2)模板函式類似於過載函式,只不過它更嚴格一些。函式被過載的時候,在每個函式體內可以執行不同的動作。但同一個函式模板例項化後的所有模板函式都必須執行相同的動作。

例如,下面過載函式就不能用模板函式代替,因為它們所執行的動作是不同的。

void outdate(int i)

(3)在函式模板中允許使用多個型別引數。但是應當注意template定義部分的每個型別引數前必須有關鍵字class(typename)。

#inculde

template

void myfunc(type1 x,type2 y)

void fun(int i,char c)

{max(i,i); // 正確,呼叫max(int,int)

C 中的建構函式問題,c 建構函式的問題

建構函式一般用來對類中的資料成員進行初始化工作,但並不是要對全部資料初始化,你只需要選擇自己需要的資料進行賦值即可。其實這一點從預設的建構函式也能看出來 當你沒有顯示的寫乙個建構函式的時候,編譯器會為你提供乙個預設的建構函式,它沒有引數,只有乙個空語句,也就是說它沒有對任何資料成員進行初始化。由於構...

C 中的string str問題

都不是。string是個類,string str,是定義乙個名叫str的字串物件。str內部儲存著字串的內容,通過str.c str 可以獲取這個字串的首位址。string str abc 這也不是將str賦值為 abc 的首位址,而是使用 abc 為值來初始化乙個string類。建議先補一下c 物...

c指標陣列問題,C 中關於指標陣列的問題。

typedef 是 定義一種資料型別 就好像內建的資料型別如 int 它僅是乙個定義,不產生例項物件,即不分配任何記憶體,怎麼能給它賦值呢?對陣列賦初值的方法用for迴圈,在這裡還可用memset nod的記憶體分配在動態棧上,所以值不能確定,要初始化,必須使用顯式的方式。cdma980的回答是對的...