2013-08-23 43 views
0

我有一個使用模板的多文件項目。用於列出所有可能的模板實現的C++解決方法

// Foo.h 
template <class T> 
class Foo 
{ 
    T bar; 
}; 

我有一個類(例如杯)和一類該類的子類。

// Cup.h 
class Cup 
{ 
}; 

class Chalice : public Cup 
{ 
}; 

class SippyCup : public Cup 
{ 
}; 

// ...etc. 

在模板的.cpp文件中,我需要列出所有可能的模板實現以避免鏈接器錯誤。我從C++ FAQ瞭解到這一點。

//Foo.cpp 
template class Foo<Cup>; 
template class Foo<Chalice>; 
template class Foo<SippyCup>; 
// ...etc. 

實際上,我在我的代碼中的任何點都有大約20個以上的子類。在開發中,我不斷創建新的子類。所以每次我創建一個新的時候,我必須將它添加到Foo.cpp這個不斷增長的列表中。

這是一種痛苦。有沒有辦法避免必須列出所有這些可能性?

+4

「在模板的.cpp文件中......」停在那裏,並且[閱讀本文](http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in -header-file) – WhozCraig

+0

有沒有理由不希望頭中的定義? – jrok

+0

上面的鏈接是超級有用和相關的。不把標題中的定義放在標題中的唯一原因是美學。但是最好把它們都列在cpp文件中。 –

回答

4

避免它的方法是將模板函數定義放在頭文件中(即在實際的模板定義中),而不是在單獨的.cpp文件中。

+0

我也嘗試使用描述的方法[這裏](http://stackoverflow.com/questions/5467785/circular-inclusion-with-templates)使用.tpp文件。謝謝。 –

0

那麼沒有任何模板專業化的Foo類定義需要存在於.h文件(或如上面鏈接中所述的.tpp文件)中。但是,需要在.cpp文件中定義模板專用類定義,並在.h文件(或.tpp文件)中使用該類型的前向聲明。因此,例如,你想爲世界盃thens

// Foo.h 
template <class T> 
class Foo 
{ 
    T bar; 
}; 

template<> class Foo<Cup>; 

不同的模板類的定義,然後你可以有相同的頭文件或不同的頭文件裏面的模板類的這種特殊形式的不同的聲明。所有模板成員函數和類的模板化(非獨立表示)的構造函數應該位於.h文件(或.tpp文件)中,但Cup專用模板類的構造函數必須位於.cpp文件中避免鏈接錯誤。同樣,非專業模板類和專用模板類的所有非模板化成員函數都必須在.cpp文件中定義,如果它們不是inline :)。希望這可以幫助!!!!

相關問題