有一個包含三個模板的類。具有不同參數個數的模板函數
#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);
正如你所看到的,對於一個模板參數數目不同於別人。
現在緩存(),有它調用accessBlock()函數
template<class TagStore>
bool Cache<TagStore>::access(PacketPtr pkt, BlkType *&blk, int &lat, PacketList &writebacks)
{
...
blk = tags->accessBlock(pkt->getAddr(), lat, id);
...
}
在confing文件,所有的模板被定義
#define USE_CACHE_LRU 1
#define USE_CACHE_FALRU 1
#define USE_CACHE_IIC 1
我不知道這個文件是如何編譯。如您所見,FALRUBlk::accessBlock()
需要4個參數。但是在Cache::access()
中,只傳遞了三個參數。 那麼有人可以解釋如何編譯這個函數沒有問題?
那麼不是「參數必須匹配」重要嗎? – mahmood 2012-01-18 17:40:54
@mahmood當然參數必須匹配(否則你會得到一個編譯錯誤)。在第一種情況下,由於您通過傳遞3個值來調用它,所以'0'被自動分配給inCache變量)。 – 2012-01-18 17:42:43
問題是,當我爲'BlkType * accessBlock'(現在需要四個參數)添加另一個參數時,編譯器說錯誤,無法將我的第四個參數轉換爲'int *'(這是'FALRUBlk *'的第四個參數) – mahmood 2012-01-18 17:43:01