2017-03-09 66 views
0

我有一個模板函數在名稱空間下的頭文件中定義。當我將這個頭文件包含在同一個項目中的兩個源文件中時。我不會重新定義錯誤。頭文件重定義錯誤 - cpp

/* template.h */ 
namespace x 
{ 
    template<typename T> 
    function(t) 
    { 
     /* implementation */ 
    } 
} 

/*test.cpp*/ 
#include "template.h" 

/* test2.cpp */ 
#inlcude "template.h" 

在上述情況下,我沒有得到任何重新定義錯誤。爲什麼我沒有收到任何錯誤?

+1

這是因爲您沒有在頭文件中定義*函數*,所以定義了一個函數* template *。我建議你閱讀例如[爲什麼只能在頭文件中實現模板?](http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file)獲取更多信息。 –

+0

我不明白 - 你問爲什麼你沒有得到錯誤?或者是什麼?由於頭文件在每個cpp文件中都包含一次,所以沒有重定義 - 每個cpp只能看到這個頭文件一次,所以沒關係...... –

+0

當我在多個源文件中包含template.h時會發生什麼情況@Someprogrammerdude –

回答

2

因爲隱式模板實例的行爲就好像它們是隱式的inline:它們都在鏈接時合併爲一個。

0

在內部頭文件中定義好標題時,如果將內部頭文件包含到外部文件中,則將包含所有標題。

#ifndef FILE_H 
#define FILE_H 

/* ... Declarations etc here ... */ 

#endif