template模板的宣告及定義

2021-05-02 14:09:46 字數 1109 閱讀 6304

我想實現類模板的宣告跟定義分類,即分別放在h標頭檔案,cpp檔案裡

下面是我工程裡的三個檔案:

a.h標頭檔案:

#ifndef indirectlist_h_

#define indirectlist_h_

template

class a;

#endif

a.cpp檔案:

#include "a.h"

template

a::a(int maxlistsize)

main檔案:

#include

#include "a.h"

using namespace std;

int main()

main.obj : error lnk2001: unresolved external symbol "public: __thiscall a::a(int)" (??0?$a@h@@qae@h@z)

debug/a.exe : fatal error lnk1120: 1 unresolved externals

在網上查了一下,發生這種錯誤有兩種可能:

1、程式中缺少lib檔案,在project->setting裡的link中加入所需lib檔案即可。

2、在程式中函式只有宣告沒有定義,而導致這個問題的很可能的原因是在函式定義時把函式名稱寫錯了,所以以後一定要在寫函式定義時複製函式宣告中的函式名,以避免類似不必要的麻煩發生。

這個project裡也沒涉及到什麼額外的lib檔案,所以應該是第二個可能了,

函式只有宣告沒有定義。

原來這個跟模板的編譯模型有關

1.包含編譯模型:編譯器必須看到用到的所有模板的定義。就是把模板類的宣告和定義放在一起,如標頭檔案中。

2.分離編譯模型:是指模板類宣告在標頭檔案中,而成員函式和靜態資料成員放在.c/.cpp中,這時需要用c++關鍵字export指明

不過目前visual c++只支援包含編譯模式,所以在vc中只能將類宣告跟定義放在同乙個檔案中。

為什麼c++編譯器不能支援對模板的分離式編譯:http://blog.csdn.net/pongba/archive/2003/10/24/19130.aspx

模板宣告中template 和template

在c template中很多地方都用到了typename與class這兩個關鍵字,而且好像可以替換,是不是這兩個關鍵字完全一樣呢?相信學習c 的人對class這個關鍵字都非常明白,class用於定義類,在模板引入c 後,最初定義模板的方法為 template.在這裡class關鍵字表明t是乙個型別,...

template模板及模板類的例項化

通常,當我們呼叫乙個函式時,編譯器只需要掌握函式的宣告。類似的,當我們使用乙個類型別的物件時,類定義必須是可用的,但成員函式的定義不必已經出現。因此我們將類定義和函式宣告放在標頭檔案中,而普通函式和類的成員函式的定義放在原始檔中。模板則不同 為了生成乙個例項化版本,編譯器需要掌握函式模板或類模板成員...

c 中的模板template

1.定義乙個模板 template,其中關鍵字typename可以換成class,t為自定義的型別名稱。template t void swap t a,t b 2.過載乙個模板 和上面一起定義的時候 template void swap t a,t b 3.對於具體的方法名,可以有三種過載版本 其...