3

重複の可能性:
テンプレート クラスの実装と宣言を同じヘッダー ファイルに含める必要があるのはなぜですか?

ヘッダー ファイルでテンプレートを定義しようとしており、その定義を cpp ファイルで定義しようとしています。テンプレートは派生クラス内で定義する必要があります。だからこれは私が得たものです:

ヘッダー ファイル:

#ifndef  ........
#define .....
 template <class mytypename>
 class abcBaseClass:public abcDerivedClass{
 public:
     mytypename getvalue(char*)
};
#endif


ソースファイル:

mytypename abcDerivedClass<mytypename>::getvalue(char* name){

}

これが正しい方法であるかどうかを知りたかっただけですか?.

これは私が達成しようとしていることです...私が電話をかけたい最後の方法は

double x = a->getvalue<double>(char)
4

3 に答える 3

3

同様の質問がSOですでに何度も行われています。

しかしとにかく...

まず、構文エラーが発生しました。

それ以外の

#ifndef  ........
#define .....
 template <class typename>
 class abcBaseClass:public abcDerivedClass{
 public:
     typename getvalue(char*);
};
#endif

このようなものでなければなりません。

#ifndef  ........
#define .....
 template <typename T>
 class abcBaseClass:public abcDerivedClass{
 public:
     T getvalue(char*);
};
// Definition follow in this file!
// For reasons or work-arounds, read below.
#endif

また、テンプレート宣言と定義の両方を同じファイルに入れる必要があります。1つの例外は、そのテンプレートを、テンプレート定義があるソースファイルのあるタイプにインスタンス化する場合です。

このようなもの。

#include "this_template.h"

template <typename T>
// all sorts of definitions...

// Explicit instantiate this template!!!!
template class abcBaseClass<Your_Type_Goes_Here>;

このアプローチの根本的な欠陥は、プログラム内の他の場所では、このソースファイルで明示的にインスタンス化したタイプしか使用できないことです。このテンプレートを他のタイプでインスタンス化しようとすると、リンカは一致する定義が見つからないと文句を言います。

テンプレートが一般的であり、テンプレートクラスの定義を別の場所に置くことを主張する場合。定義を別のヘッダーファイルに入れて、次のように呼び出してインクルードすることがthis_template_impl.hできthis_template.hますthis_template_impl.h

次に、ソースファイルに、の代わりに次の#include "this_template.h"ように記述します。#include "this_template_impl.h

于 2012-10-18T18:10:31.603 に答える
1

定義を .cpp ファイルに入れることもできますが、それはより面倒であり、テンプレートが通常行われる方法ではありません。

.cpp に追加のコードを追加して、必要なテンプレート パラメーターが入力された関数をコンパイラに生成させる必要があります。1 つの方法は、何らかの方法で関数を使用することです。

mytypename abcDerivedClass<mytypename>::getvalue(char* name){

}

void dummy()
{
    abcDerivedClass<double> temp;
    temp->getvalue(NULL);
}

ダミー関数を実際に呼び出す必要はありません。(テンプレート定義の後に) 存在するだけで十分です。

テンプレートを明示的にインスタンス化する別の方法があると確信していますが、これを行っていないため、思い出せません。

于 2012-10-18T18:22:05.910 に答える
0

いいえ、これは正しい方法ではありません:

次のように行う必要があります。

#ifndef  ........
#define .....
 template <class T>
 class abcBaseClass:public abcDerivedClass{
 public:
     T getvalue(char*)
};

#endif

および .cpp ファイル内: template T abcBaseClass::getvalue(char * ch){ }

コードが正しくない理由typenameは、C++ キーワードであるためです。コンパイル中にエラーをスローする必要があります

以下も使用できます。

#ifndef  ........
#define .....
 template <typename T>
 class abcBaseClass:public abcDerivedClass{
 public:
     T getvalue(char*)
};
#endif

C++ ファイルでは次のようになります。

template<class T>
T abcBaseClass<T>::getvalue(char * ch){
}
于 2012-10-18T18:05:16.313 に答える