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つの引数だけが渡されます。 誰かがこの関数を問題なくコンパイルする方法を説明できますか?第四のデフォルト値が使用されているため
「引数の数は一致する必要がありますか」重要ではありませんか? – mahmood
@mahmood引数が一致する必要があります(そうしないと、コンパイルエラーが発生します)。 1番目のケースでは、3つの値を渡して呼び出すので、inCache変数には自動的に '0'が割り当てられます)。 –
第4引数を 'int *'( 'FALRUBlk *'の第4引数)に変換できないというエラーがコンパイラから出されます。 – mahmood