C++中template的.h文件和.cpp文件的問題


在C++中,用到類模板時,如果類似一般的類聲明定義一樣,把類聲明放在.h文件中,而具體的函數定義放在.cpp文件中的話,會發現編譯器會報錯。如類似下面代碼:

//test.h文件
#ifndef TEST_H_
#define TEST_H_

template <class T>
class test
{
private:
    T a;
public:
    test();
};

#endif
//test.cpp文件
#include "test.h"

template <class T>
test<T>::test()
{
    a = 0;
}
//main.cpp文件
#include <iostream>
#include "test.h"
using namespace std;

int main()
{
    test<int> abc;
}

以上代碼在編譯時會產生如下錯誤:

Error    2    error LNK1120: 1 unresolved externals
Error    1    error LNK2019: unresolved external symbol "public: __thiscall test<int>::test<int>(void)" (??0?$test@H@@QAE@XZ) referenced in function _main

原因在於,類模版並不是真正的類,它只是告訴編譯器一種生成類的方法,編譯器在遇到類模版的實例化時,就會按照模版生成相應的類。

在這里就是編譯器遇到main函數中的test<int> abc;時就會去生成一個int類型的test類。

而每一個cpp文件是獨立編譯的,那么如果將類模版的成員函數單獨放在一個cpp文件中,編譯器便無法確定要根據什么類型來產生相應的類,也就造成了錯誤。

一般的解決方法就是將類模版中的成員函數定義也寫入.h文件中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM