2011-10-11 5 views
0

자동 반환 유형 템플릿을 사용하려고했지만 문제가 있습니다. STL 맵을 허용하고 맵의 인덱스에 대한 참조를 리턴하는 함수를 작성하려고합니다. 이 코드를 올바르게 컴파일하기 위해 누락 된 부분은 무엇입니까?템플릿 함수에서 auto 및 decltype 사용

(참고 :. 내가지도를 있으리라 믿고있어하는 것은 나중에 올바르게 사용되는 확인하기 위해 내가 가능성이 부스트 개념 검사를 추가합니다 0의 정수 할당과 초기화 할 수 있습니다)

template <typename MapType> 
// The next line causes the error: "expected initializer" 
auto FindOrInitialize(GroupNumber_t Group, int SymbolRate, int FecRate, MapType Map) -> MapType::mapped_type& 
{ 
    CollectionKey Key(Group, SymbolRate, FecRate); 
    auto It = Map.find(Key); 
    if(It == Map.end()) 
     Map[Key] = 0; 
    return Map[Key]; 
} 

코드의 예 이 함수는 다음과 같습니다.

auto Entry = FindOrInitialize(Group, SymbolRate, FecRate, StreamBursts); 
Entry++; 
+1

어떤 컴파일 오류가 발생합니까? 또한 여기에'decltype'을 사용하거나 늦게 지정한 리턴 타입을 사용할 필요가 없습니다. 그냥 평소와 같이 왼쪽에 넣으십시오. –

+0

"STL"을 정말로 말합니까? 아니면 "C++ 03 표준 라이브러리"를 의미합니까? 또는 태그에 "C++ 11 표준 라이브러리"가 있습니까? 제발 하나 사주세요. –

답변

2

접미사 리턴 유형 선언에 MapType보다 앞에 typename을 추가하십시오.

추가하는 것을 잊지 경우 typename 당신이 오류 같은 종류를 얻을 것이다 (여기 GCC 4.6.0) :

template <typename MapType> 
auto FindOrInitialize() -> MapType::mapped_type& 
{ 
    ... 
} 

그러나 대한 :

test.cpp:2:28: error: expected type-specifier 
test.cpp:2:28: error: expected initializer 

당신에게 뭔가를 줄 것이다 당신이하려고하는 경우 접미사 구문이 필요 없습니다.

template <typename MapType> 
typename MapType::mapped_type& FindOrInitialize() 
{ 
    ... 
} 

여기서를 잊어 버리면와 같은 오류가 발생합니다 :

test.cpp:2:1: error: need ‘typename’ before ‘MapType::mapped_type’ because ‘MapType’ is a dependent scope 

어떤 것이 더 뚜렷한 것입니까?

+0

감사합니다. Geoffroy! 새로운 정의가 완벽하게 작동했습니다! typename MapType :: mapped_type & FindOrInitialize (GroupNumber_t 그룹, int SymbolRate, int FecRate, MapType 맵) –