web-dev-qa-db-ja.com

クラス内でテンプレート関数を作成する方法は? (C ++)

テンプレート関数を作成することは可能です。

template<typename T>
void DoSomeThing(T x){}

また、テンプレートクラスを作成することもできます。

template<typename T>
class Object
{
public:
    int x;
};

しかし、テンプレート内にないクラスを作成し、そのクラスの関数をテンプレートにすることは可能ですか?すなわち:

//I have no idea if this is right, this is just how I think it would look
class Object
{
public:
    template<class T>
    void DoX(){}
};

またはクラスはテンプレートの一部ではありませんが、関数はどこですか?

135
user98188

あなたの推測は正しいものです。覚えておく必要があるのは、メンバー関数テンプレートdefinition(宣言に加えて)はcppではなくヘッダーファイルにあることですが、それはnotですクラス宣言自体の本体に含まれている必要があります。

106
Not Sure

こちらをご覧ください: テンプレートテンプレートメソッド 、メンバーテンプレート、メンバー関数テンプレート

class   Vector
{
  int     array[3];

  template <class TVECTOR2> 
  void  eqAdd(TVECTOR2 v2);
};

template <class TVECTOR2>
void    Vector::eqAdd(TVECTOR2 a2)
{
  for (int i(0); i < 3; ++i) array[i] += a2[i];
}
64
none

はい、テンプレートメンバ関数は完全に合法であり、多くの場合に役立ちます。

唯一の注意点は、テンプレートメンバー関数を仮想にすることはできないということです。

19
Tobias

最も簡単な方法は、宣言と定義を同じファイルに入れることですが、実行可能なファイルが大きすぎる可能性があります。例えば。

class Foo
{
public:
template <typename T> void some_method(T t) {//...}
}

また、テンプレート定義を個別のファイルに配置する、つまり.cppファイルと.hファイルに配置することもできます。必要なのは、テンプレートのインスタンス化を.cppファイルに明示的に含めることだけです。例えば。

// .h file
class Foo
{
public:
template <typename T> void some_method(T t);
}

// .cpp file
//...
template <typename T> void Foo::some_method(T t) 
{//...}
//...

template void Foo::some_method<int>(int);
template void Foo::some_method<double>(double);
3
hey