2014-06-22 5 views
0

가변 템플릿 매개 변수 팩 유형에 쉽게 액세스 할 수 있도록 using 문을 작게 썼습니다.Variadic 템플릿 및 형식 정의에 'using'사용

template<size_t index, typename args...> 
using get = std::tuple_element<index, std::tuple<args...>>::type; 

그러나 clang (3.5.0) 또는 gcc (4.9.0)로 컴파일하는 것은 실패합니다.

using 문이 가변 인자 템플릿을 결합
error: expected ',' or '>' in template-parameter-list template<size_t index, typename args...> 
                         ^

아닌가 : 다음은 그 소리의 오류 출력은? 아니면 내가 잘못하고있는거야?

+0

어쩌면'typename' 후'='? ':: type'은 템플릿 매개 변수 – leemes

+1

에 의존하기 때문에 'typename ... args'가 아니기 때문에 오타를위한 VTCd가 필요합니다.'typename args ... '가 아니기 때문에'typename'도 필요합니다. – chris

+1

닫기 투표의 나머지 절반을 원하면 http://stackoverflow.com/questions/610245/where-and-why-do-i-have-to-put-the-template-and-typename- keywords – chris

답변

4

코드에서 두 가지 문제가 있습니다. std::tuple_element<...>의 정의 ...이 무엇인지에 의존하기 때문에

먼저, 당신은 그래서 당신은 그것의 앞에 typename 필요 ::type이 유형의 이름을 참조 컴파일러에게해야합니다.

둘째, 가변 인자 템플릿 매개 변수 즉 typename (또는 class)과 팩의 이름, typename ...args 대신 typename args... 사이에 자신의 줄임표 있습니다.

그래서 고정 된 코드는 다음과 같습니다

template<size_t index, typename ...args> 
using get = typename std::tuple_element<index, std::tuple<args...>>::type; 
6

매개 변수 팩의 줄임표는 typename (또는 class) 키워드 뒤에 와야합니다. 팩을 확장하면 매개 변수 이름 뒤에옵니다.

template<size_t index, typename... args> 
//        ^^^ 
using get = typename std::tuple_element<index, std::tuple<args...>>::type; 
//   ^^^^^^^^^ 

은 또한 중첩 의존의 형태를 참조 할 때 필요한 typename 키워드를 놓치고있어.

관련 문제