2014-12-13 68 views
2

我呼籲我的C模板++程序:我應該用C++分開cpp和h文件嗎?

const matrix::CMatrix<double> M1(3,3,{{5.0,0.0,2.0},{1.0,1.0,3.0},{6.0,7.0,7.0}}); 

我得到這樣的鏈接錯誤:

tests.h:15: undefined reference to `matrix::CMatrix<double>::CMatrix(int, int, std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >)' 

大規模的搜索,終於我意識到這是因爲我分開我的H和CPP文件而template不能容忍它。在C中,建議分隔c和h文件並使用Makefile。但根據C++中的這些問題,它仍然建議將cpp和h文件分開嗎?在h文件和cpp文件中的一些其他函數中實現一些模板並不是乾淨的方式。我該怎麼辦?

編輯:

matrix.h

template<typename T> 
class CMatrix 
{ 
..... 

matrix.cpp

implementation of CMatrix 

的main.cpp

defining M1 
+0

你是什麼意思的「分離」?您的模板在(.cpp或.h)中聲明的位置以及它的使用位置在哪裏? – Ashalynd 2014-12-13 08:03:13

回答

1

是的,您應該將.CP文件與.h文件分開。
這不僅僅是一個建議。

.cpp文件被編譯爲編譯單元,這意味着每個.cpp文件都會被編譯到.obj文件中,它包含所有代碼以及它包含的所有代碼。

因此,如果您在包含在許多.cpp文件中的.h文件中有一些代碼,它會進行多次編譯。

當你有多個項目和庫時,這個事實會變得很難看。

無論如何,模板是一個不同的問題。
模板calsses直到它們被實例化時才真正被編譯(直到你使用它們)。
然後編譯器爲正確的類型創建所需的代碼。
它不只是編譯了第一次compliler看到模板代碼(如「常規」代碼)

所以,你需要有一個頭文件模板代碼,所以編譯器「看到」它每個使用它的編譯單元(.cpp)文件。
所以編譯器可以在需要的地方創建正確的代碼。

1

如果你想在多個文件中使用你的模板,把模板放在一個頭文件中,這樣你就可以在其他地方包含它。如果你只需要該文件中的模板,然後把它放在cpp中。

0

如果模板化方法是私有的,您可以並應該將定義(方法體)放入.cpp文件中。他們只需要在.hpp文件中,如果他們是公開的。

有把一切在頭一個問題:如果你畫你的所有文件的依賴關係樹,main.cpp中爲根節點,那麼它只是如果沒有朝上的依賴關係的作品。這當然是一個偉大而簡單的設計,但實際上你經常需要一些後向引用(可以是任何東西,比如將某個類作爲參數或將某個類作爲成員的方法)。在這一點上,你可能會得到很多「不完整的類」編譯器錯誤...

相關問題