2017-11-18 242 views
1

閱讀了關於模板之後,我對它們的編譯感到困惑。例如,在一個頭,我們定義一個模板 -多個目標文件中的C++模板和彙編

template<typename T> 
class Object { 
public: 
    Object(); 
    void hashCode(T& arg){ /* implementation code in header-only. */ } 
}; 

我們使用這個模板在兩個源文件 - SourceI.cpp & SourceII.cpp通過包括Object.hpp -

SourceI.cpp

void doSomething() 
{ 
    Object<int> intHasher; 
    intHasher.hashCode(); 
    // Further code... 
} 

SourceII.cpp

void doNothing() 
{ 
    Object<int> notUsedHere; 
    notUsedHere.hashCode(); 
} 

編譯應該產生「int」類型的類實例化代碼。 Object <int>類型的代碼將存儲在哪裏。或者將對象<int> :: hashCode()的代碼在所有用途中內聯?

如果代碼沒有內聯,那麼符號衝突會不會鏈接,因爲它們會出現在多個對象文件中?

注意 - 代碼是給出一個例子,並沒有顯示任何目的。

+0

相關:https://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file – user0042

回答

1

當你編譯這個時,SourceI.cpp和SourceII.cpp都會有一個Object < int>的副本。這被稱爲代碼膨脹,並且是使用模板的缺點之一。

當你鏈接這個時,鏈接器會假設對象< int>的兩個實例是相同的,並且除了一個以外全部丟棄。

+2

因此......畢竟(在這種情況下)沒有缺點。 –

+0

這是否意味着鏈接器必須知道C++模板? –

+0

另外,然後預編譯頭文件被使用,對吧? –

相關問題