2012-01-18 3 views
1

세 개의 템플릿이있는 클래스가 있습니다.다른 인수 수를 가진 템플릿 함수

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()에는 세 개의 인수 만 전달됩니다. 누군가이 함수가 문제없이 어떻게 컴파일되는지 설명 할 수 있습니까?

답변

3

4의 기본값이 사용되기 때문에 그것은, 잘 컴파일 :

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 물론 인수가 일치해야합니다 (그렇지 않으면 컴파일 오류가 발생합니다). 첫 번째 경우에는 3 개의 값을 전달하여 호출하므로 inCache 변수에 '0'이 자동으로 할당됩니다. –

+0

문제는 'BlkType * accessBlock'에 다른 인수를 추가 할 때 (현재 4 개의 인수를 사용함) 컴파일러가 내 네 번째 인수를'int *'(FALRUBlk *의 네 번째 인수)로 변환 할 수 없다는 오류입니다. – mahmood

0

C++ 및 대부분의 다른 프로그래밍 언어에서 def 함수의 인수에 대한 값. C++에서는 특별히 템플릿 화 된 클래스에 대한 기본 템플릿 인수를 제공 할 수도 있습니다.

일반적으로 기본 인수는 끝에옵니다. 인수 목록에 마지막 인수가있는 매개 변수를 넣어야합니다. 기본 인수를 갖는 매개 변수의 수에는 제한이 없습니다. 모든 사항에 대해 함수에 기본값이있는 각각 10 개의 매개 변수가있을 수 있습니다.

그럴 경우, 모든 집중적 인 목적을 위해 함수가 기본값으로 지정된 값을 사용하여 함수를 호출 한 것처럼 동작하므로 모든 인수를 전달하지 않고 10 인자 함수를 호출 할 수 있습니다.

당신이 생각하는 것보다 더 많이 사용하십시오. 좀 더 복잡한 예제의 경우 std :: set와 같은 STL 연관 컨테이너가 순서를 지정합니다. 그들은 "< 연산자를 사용하여이 컨테이너의 항목을 정렬해야합니다"라는 std :: less <의 "기본 템플릿 인수"를 제공합니다. 또한 메모리 관리 인터페이스를 정의하는 할당기에 대한 또 다른 기본 템플리트 인수를 제공합니다.

기본 인수를 "오버라이드"하여 변경하지 않는 이상 완전히 숨겨집니다. 실제 유형이 std::set<Key, Compare, Allocator<Key> >;과 비슷할 경우 std::set<DataType>으로 세트를 만들 수 있습니다. .

관련 문제