Есть класс с тремя шаблонами.
#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
Этот шаблон имеет общую функцию:
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);
Как видите, количество аргументов для одного из шаблонов отличается от других.
Теперь в Cache () есть функция, которая вызывает accessBlock ()
template<class TagStore>
bool Cache<TagStore>::access(PacketPtr pkt, BlkType *&blk, int &lat, PacketList &writebacks)
{
...
blk = tags->accessBlock(pkt->getAddr(), lat, id);
...
}
В конфигурационном файле определены все шаблоны
#define USE_CACHE_LRU 1
#define USE_CACHE_FALRU 1
#define USE_CACHE_IIC 1
Интересно, как этот файл скомпилирован? Как видите, FALRUBlk::accessBlock()
принимает 4 аргумента. Однако в Cache::access()
передаются только три аргумента.
Так может кто-нибудь объяснить, как эта функция скомпилирована без проблем?