2017-03-10 62 views
1

我是新來的全職C++編程,所以我試圖更好地理解各種細節中涉及的細微差別。使用模板的C++方法定義

我在一個小型項目中使用模板,主要是在學習時編寫代碼,而且我遇到了一些我不確定的事情。 Visual Studio的幫助我產生(在我的.cpp文件從我的.h文件)的代碼等價於:

template<class T> 
PriorityQueue<T>::ClimbDownHeap(const int currentNodeIndex) 
{ 
} 

template<class T> 
PriorityQueue<T>::GetRightNodeIndex(const int currentNodeIndex) 
{ 
} 

我的印象,雖然這將是同樣有效:

template <class T> 
class PriorityQueue 
{ 
public: 
    ClimbDownHeap(const int currentNodeIndex) 
    { 

    } 
private: 
    GetRightNodeIndex(const int currentNodeIndex) 
    { 
    } 
}; 

我的理解可能是錯誤的,但至少目前爲止,似乎兩者都可以編譯。這兩種風格之間是否有重大差異?我更喜歡第二個,因爲它對我來說更加乾淨明瞭。這些之間的細微差別是什麼?

注意:在顛簸的火車上打字時,如果格式問題或代碼不清楚(我從我嘗試過的內存中輸入它,它不是確切的),我很抱歉。

+2

將模板定義放入源文件可能會有問題。您可以閱讀[this](http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file)問題以瞭解更多信息。 –

+0

請參閱[爲什麼模板只能在頭文件中實現?](http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file) –

+1

I可以推薦** CppCon 2016的演講:Arthur O'Dwyer「Template Normal Programming」** [Part1](https://www.youtube.com/watch?v=vwrXHznaYLA)和[Part2](https:// www.youtube.com/watch?v=VIz6xBvwYd8) –

回答

1

如果您想使用其他文件中的模板類,則必須將您的模板代碼放在標題中。放入源文件有效地使其私人化(通過使鏈接不可能)。

正如詹姆斯在評論中提到的,閱讀詳細的解釋和例子here

+0

如果我正確地閱讀這些答案,並且我不認爲我是這樣,那麼這是否意味着最簡單的解決方案是定義.h文件中的所有實體,並且可能只是廢除.cpp? 這是一個比Java或C#中的泛型更難以掌握的東西,但我想我至少會看到概念差異和性能影響。 – Caboose