1

テンプレート関数の本体は、実際にそれを使用するファイルに含める必要があることを読みました (つまり、宣言だけでは不十分です)。

ヘッダー ファイルでテンプレート関数を定義するとします。

//someheader.h
#ifndef SOME_H
#define SOME_H
template<class T>
void MyTemplateFunc(T *In, ...)
{

//definitions here   

}
#endif

実際には、2 つの異なる cpp ファイルで使用できます。

//file1.cpp
#include "someheader.h"
void f1()
{
   //some code
   MyTemplateFunc<int>(Some_int_Pointer);//use template here

}

//file2.cpp
#include "someheader.h"
void f2()
{
   //some code
   MyTemplateFunc<float>(Some_float_Pointer);//use template here

}

今、私は文句を言っているわけではありません (理解しようとしているだけです) が、この場合、コンパイル/リンク エラーが発生しないのはなぜですか? 二重インクルージョン ガードにより、「someheader.h」が cpp ファイルの 1 つにのみインクルードされるため、他の cpp ファイルがテンプレート定義を「見る」ことができないと不平を言うことになります。

ここで何が欠けていますか?

ありがとう

ベニー

4

2 に答える 2

1

あなたの file1.cpp と file2.cpp は、互いに独立した2つの異なるファイルであるように思えます。

次の場合、エラー メッセージが表示され、コードの実行に失敗したことになります。

ifndef を使用せず、 file1.h を file2.h にインクルードした場合、 file2.h で someheader.h" が 2 回宣言されます。これは、既に file1.h で宣言されているためです。

//someheader.h

template<class T>
void MyTemplateFunc(T *In, ...)
{

  //definitions here   

}

file1 ヘッダファイル

//file1.h
#include "someheader.h"

void f1();

および file2 ヘッダー ファイル

//file2.h

#include "file1.h" //! note, it already has declared someheader.h
#include "someheader.h" //! you are declaring it again
void f2();

このような問題を解決するには、ifndef または #pragma once を含める必要があります。これにより、現在のソース ファイルが 1 回のコンパイルで 1 回だけ含まれるようになります。

于 2017-01-27T06:41:49.700 に答える
1

「二重インクルージョンガードにより、「someheader.h」がcppファイルの1つにのみインクルードされるため」

それは間違っています。そのガードは、翻訳単位での複数の宣言を回避します。したがって、それを各翻訳単位に一度含めれば、すべて問題ありません。

さらに、 1 つの定義規則inlineに従うように、ヘッダー ファイル内でその関数を使用する必要があります。

于 2013-11-13T16:44:21.947 に答える