2012-01-18 41 views
1

3つのテンプレートを持つクラスがあります。異なる数の引数を持つテンプレート関数

FALRUBlk* accessBlock(Addr addr, int &lat, int context_src, int *inCache = 0); 
IICTag* accessBlock(Addr addr, int &lat, int context_src); 
BlkType* accessBlock(Addr addr, int &lat, int context_src); 

あなたが見ることができるように、テンプレートのいずれかの引数の数が他と異なります

#if defined(USE_CACHE_FALRU) 
template class Cache<FALRU>; 
#endif 

#if defined(USE_CACHE_IIC) 
template class Cache<IIC>; 
#endif 

#if defined(USE_CACHE_LRU) 
template class Cache<LRU>; 
#endif 

これらのテンプレートは、一般的な機能を持っています。キャッシュで今

()、confingファイルで

template<class TagStore> 
bool Cache<TagStore>::access(PacketPtr pkt, BlkType *&blk, int &lat, PacketList &writebacks) 
{ 
... 
blk = tags->accessBlock(pkt->getAddr(), lat, id); 
... 
} 

()accessBlockを呼び出す機能があり、すべてのテンプレートが

#define USE_CACHE_LRU 1 
#define USE_CACHE_FALRU 1 
#define USE_CACHE_IIC 1 

を定義している私は、このファイルをコンパイルする方法を疑問に思います。ご覧のとおり、FALRUBlk::accessBlock()は4つの引数をとります。しかし、Cache::access()では、3つの引数だけが渡されます。 誰かがこの関数を問題なくコンパイルする方法を説明できますか?第四のデフォルト値が使用されているため

答えて

3

それは、罰金コンパイル:

FALRUBlk* accessBlock(Addr addr, int &lat, int context_src, int *inCache = 0); 

他の2つのいるだけで3つの引数:

IICTag* accessBlock(Addr addr, int &lat, int context_src); 
BlkType* accessBlock(Addr addr, int &lat, int context_src); 

したがって、あなたは常にあなたのようにそのメソッドを呼び出すことができます例:

blk = tags->accessBlock(pkt->getAddr(), lat, id); 
+0

「引数の数は一致する必要がありますか」重要ではありませんか? – mahmood

+0

@mahmood引数が一致する必要があります(そうしないと、コンパイルエラーが発生します)。 1番目のケースでは、3つの値を渡して呼び出すので、inCache変数には自動的に '0'が割り当てられます)。 –

+0

第4引数を 'int *'( 'FALRUBlk *'の第4引数)に変換できないというエラーがコンパイラから出されます。 – mahmood

0

C++、および他のほとんどのプログラミング言語では、あなたはDEFを設定することが許可されています関数への引数の値。 C++では、テンプレート化されたクラスに対してデフォルトのテンプレート引数を提供することさえできます。

一般的なルールは、デフォルトの引数が最後にあることです。あなたは引数リストの最後にデフォルト引数を持つパラメータを置く必要があります。デフォルトの引数を持つ任意の数のパラメータを持つことができます。あなたが気にしている限り、関数はそれぞれデフォルト値を持つ10個のパラメータを持つことができます。

すべての集中的な目的のために、デフォルトとして指定された値で関数を呼び出すように機能するため、10引数の関数は任意の引数を渡さずに呼び出すことができます。

あなたはこれ以上考えることができます。もう少し複雑な例では、std :: setなどのSTLの関連コンテナには順序があります。それらは、 "このコンテナの項目は、演算子<を使ってソートされなければならない"というstd :: less <の "デフォルトテンプレート引数"を提供します。また、メモリ管理インタフェースを定義するアロケータの別のデフォルトのテンプレート引数も提供します。

デフォルトの引数を「上書き」することによって、それらを変更することを決定しない限り、それらが完全にあなたから隠されている。、あなたは本当のタイプは、よりstd::set<Key, Compare, Allocator<Key> >;のように見ているものになるだろうときだけstd::set<DataType>とのセットを作成することができるしている理由であります。

関連する問題