c++ 變量的重複定義問題 [multiple definition of] 與模板類

    這兩天開始慢慢複習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文件 編譯器沒法實例化模板的實現。有了這三句,編譯器就事先實例化這幾種類型。而後連接就不會出錯了。

相關文章
相關標籤/搜索