データ構造の割り当てを完了しようとしたとき、実装ファイルには次で始まる関数がいくつかあります。
template <class ItemType>
ClassName<ItemType>::ClassName( )
{
}
私は今、
<ItemType>
特定の型 (String、double、int など) の置換用です。しかし、の機能は何ですか
template <class ItemType>
関数の実装の前に毎回言わなければならないことですか?
クラスまたは関数がテンプレート クラス/関数であること、およびテンプレート引数の名前が何であるかをコンパイラに伝えるためです。
通常の関数の引数に関しては、宣言内の名前は定義内の名前と同じである必要はありません。だからあなたは例えばを持つことができます
template<typename Foo>
struct Bar
{
void f(int a);
};
template<typename Beer>
void Bar<Beer>::f(int flop)
{
}
これは、ネストされたテンプレート クラスと関数、およびそれらを含むクラスの外での特殊化を定義する方法の一部です。
#include <exception>
template<class yams_t>
class outer
{
public:
template<class potatoes_t>
class inner;
};
template<class yams_t>
template<class potatoes_t>
class outer<yams_t>::inner
{
public:
template<typename result_t>
result_t verb_my_noun();
};
template<class yams_t> // yams_t is resolved first
template<class potatoes_t> // potatoes_t is resolved next
template<typename result_t> // result_t is resolved last
result_t outer<
yams_t // we want to parameterize outer<> first
>::inner<
potatoes_t // then inner<>
>::verb_my_noun() // then verb_my_noun()
{
return result_t(47);
}
template<>
class outer<float>
{
public:
template<class potatoes_t>
class inner;
};
template<>
class outer<float>::inner<float>
{
public:
template<typename result_t>
result_t verb_my_noun()
{
throw std::exception("You've been verbed!");
}
};
template<>
class outer<float>::inner<double>
{
public:
template<typename result_t>
result_t verb_my_noun();
};
// As this is a full specialization of both
// outer<> and its inner class inner<>,
// we don't need two 'template<>'s above this.
//
// However, we still need a template<> for verb_my_noun()
template<typename result_t>
result_t outer<float>::inner<double>::verb_my_noun()
{
return result_t();
}
例:
int main(int argc, char **argv)
{
outer<int>::inner<unsigned> good_thing;
float x = good_thing.verb_my_noun<float>();
// x is 47.0
outer<float>::inner<float> bad_thing;
// throws exception("You've been verbed!");
float cant_see_me = bad_thing.verb_my_noun<float>();
return 0;
}
また、次のような愚かなことを行うことができることに注意してください。
template<
class alpha_t, // #1
class beta_t, // #2
class gamma_t // #3
>
class thing
{
void frob();
};
template<
class herp_t, // #1
class derp_t, // #2
class dorp_t // #3
>
void thing<herp_t,derp_t,dorp_t>::frob()
{
}
上記のようなことは実際には行わないでください。これは説明のためにありますが、実際には、テンプレート コードを非常に読みにくくしています。