2017-03-09 20 views
0

ヘッダーファイルで名前空間の下に定義されたテンプレート関数があります。このヘッダーを同じプロジェクトの2つのソースファイルに含めるとします。私は再定義のエラーを取得しません。ヘッダーファイルの再定義エラー - cpp

/* template.h */ 
namespace x 
{ 
    template<typename T> 
    function(t) 
    { 
     /* implementation */ 
    } 
} 

/*test.cpp*/ 
#include "template.h" 

/* test2.cpp */ 
#inlcude "template.h" 

上記の場合、再定義エラーは発生しません。 。私は何のエラーも受けていないのですか?

+1

これは、ヘッダーファイルに*関数*を定義していないため、関数*テンプレート*を定義するためです。私はあなたに読むことをお勧めします。 [なぜテンプレートはヘッダファイルにのみ実装できますか?](http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file) 。 –

+0

私は理解していません - なぜあなたはエラーを取得していないのですか?または何?ヘッダファイルは各cppファイルに一度含まれているので、再定義はありません - 各cppはこのヘッダを1回だけ見るので、okです... –

+0

複数のソースファイルにtemplate.hを含めるとどうなりますか@Someprogrammerdude –

答えて

2

暗黙のテンプレートのインスタンス化は、暗黙的にinlineのように動作するため、すべてがリンク時に1つに統合されます。

0

内側のヘッダーファイルを外側のファイルに含めると、すべてのヘッダーがインクルードされます。

#ifndef FILE_H 
#define FILE_H 

/* ... Declarations etc here ... */ 

#endif 
関連する問題