2017-03-10 7 views
1

私はフルタイムのC++プログラミングが初めてで、さまざまなことに関わるニュアンスをよりよく理解しようとしています。C++テンプレートを使ったメソッド定義

私は小さなプロジェクトの中でテンプレートを使用しています。ほとんどの場合、私が学んだようにコードを作り上げています。 Visual Studioは、私は(私の.hファイルから私の.cppファイルで)これにコードと同等の生成を助け:

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つの間に重要な違いはありますか?それはもっときれいで私にはっきりしているので、私は2番目を好むだろう。これらのニュアンスは何ですか?

注:これは不規則な列車に入力するので、問題の書式設定やコードが明確でない場合はお詫びします(私が試したことのメモリから入力したものですが、正確ではありません)。

+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「テンプレートノーマルプログラミング」** [Part1](https://www.youtube.com/watch?v=vwrXHznaYLA)と[Part2](https:// www.youtube.com/watch?v=VIz6xBvwYd8) –

答えて

1

他のファイルのテンプレートクラスを使用する場合は、テンプレートコードをヘッダーに挿入する必要があります。ソースファイルを置くことは、リンクを不可能にすることで、非公開にします。

Jamesがコメントで述べているように、詳細な説明と例hereを読んでください。

+0

私がこれらの答えを正しく読んでいて、私がそうは思わないなら、最も簡単な解決策は、.hファイル内のすべてのボディを定義し、.cppを削除することです。 これは、JavaやC#のジェネリックスに比べてはるかに把握が難しいですが、少なくとも、概念の違いとパフォーマンスの関係がわかります。 – Caboose

関連する問題