這兩天開始慢慢複習c++基礎知識和數據結構的內容了。由於立刻各類實習生招聘就開始啦。吼吼。node
之前在學c++的時候,沒太仔細學模板類,用的時候也不多。我想複習的時候,好好看看。結果,在用模板類實現鏈表的時候,出問題了。ios
問題1.編譯出錯c++
老規矩,四個文件 node.h,node.cpp, list.h, list.cpp。結果在編譯的時候(見makefile文件),老是出問題。查了一下,緣由是模板類不能分離編譯。因而,只能把類定義和類實現放在同一個文件裏。數據結構
問題2.全局變量spa
問題1中,把內容放在同一個文件中,能夠了。可是,若是須要在該文件定義了全局變量,怎麼辦啊?編譯器
問題1中,我吧內容都放在了node.cpp 和list.cpp中,由於沒有全局變量,因此,include cpp文件不會出神馬問題,編譯運行都經過。可是,如今若是定義了全局變量,再include cpp文件的話,就會出現屢次定義的問題。io
若是把node.cpp和node.h中的內容都寫到node.h中,又會致使編譯不太辦。由於編譯是基於.cpp的嘛。編譯
解決辦法:模板
1.把 node.cpp中的全局變量聲明成static,這是由於static僅在本文件中生效。所以,若是屢次include,會屢次定義相同的變量,但每一個變量的生存範圍仍是本身的文件。這個方法僅適用於 該變量是常量只讀的狀況。class
2.寫一個global.h 文件。把剛纔的node.cpp中的問題所有放到這裏。只不過,在global.h中,對全局變量僅僅是聲明,即須要在每一個變量前加extern,而後寫一個global.cpp文件,對每一個變量進行定義。而後在其餘的cpp中 include「global.h文件就行了。問題解決。
基礎知識之前就不怎麼熟悉,慢慢練習,加深理解。加油。
剛纔問了一個同窗,說.cpp和.h能夠分離編譯,顯示實例化模板。方法以下:
/* compare.h */
#ifndef __COMPARE_H__
#define __COMPARE_H__
template <class T>
class Compare {
public:
bool operator()(const T& a, const T& b) const;
};
struct Weight {
int weight;
};
#endif
/* compare.cpp */
#include "compare.h"
template <class T>
bool Compare<T>::operator()(const T& a, const T& b) const {
return a < b ? true : false;
}
static bool operator<(const Weight& a, const Weight& b) {
return a.weight < b.weight ? true : false;
}
template class Compare<int>;
template class Compare<double>;
template class Compare<Weight>;
/* main.cpp */
#include <iostream>
#include "compare.h"
using namespace std;
int main() {
cout << Compare<int>()(1, 2) << endl;
cout << Compare<double>()(2.0, 1.0) << endl;
Weight a, b;
a.weight = 1;
b.weight = 2;
cout << Compare<Weight>()(a, b) << endl;
return 0;
}
重要的3行我用紅顏色標註了。在分離編譯時,若是沒有這三句話,會報 undefined reference to ***。緣由是根據.h和main.cpp文件 編譯器沒法實例化模板的實現。有了這三句,編譯器就事先實例化這幾種類型。而後連接就不會出錯了。