세 개의 템플릿이있는 클래스가 있습니다.다른 인수 수를 가진 템플릿 함수
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
이 템플릿은 일반적인 기능을 가지고 있습니다.
지금 캐시()에서, 모든 템플릿 내가이 파일을 컴파일하는 방법을 궁금해#define USE_CACHE_LRU 1
#define USE_CACHE_FALRU 1
#define USE_CACHE_IIC 1
을 정의, accessBlock을 (를 호출하는 기능)을 confing 파일에서
template<class TagStore>
bool Cache<TagStore>::access(PacketPtr pkt, BlkType *&blk, int &lat, PacketList &writebacks)
{
...
blk = tags->accessBlock(pkt->getAddr(), lat, id);
...
}
있다. 보시다시피, FALRUBlk::accessBlock()
은 4 개의 인수를 취합니다. 그러나 Cache::access()
에는 세 개의 인수 만 전달됩니다. 누군가이 함수가 문제없이 어떻게 컴파일되는지 설명 할 수 있습니까?
"인수 수가 반드시 일치해야"하는 것이 중요하지 않습니까? – mahmood
@mahmood 물론 인수가 일치해야합니다 (그렇지 않으면 컴파일 오류가 발생합니다). 첫 번째 경우에는 3 개의 값을 전달하여 호출하므로 inCache 변수에 '0'이 자동으로 할당됩니다. –
문제는 'BlkType * accessBlock'에 다른 인수를 추가 할 때 (현재 4 개의 인수를 사용함) 컴파일러가 내 네 번째 인수를'int *'(FALRUBlk *의 네 번째 인수)로 변환 할 수 없다는 오류입니다. – mahmood