1

나는 ++ 그 소리에 다음 코드를 컴파일 - 600.0.51 :연타 가변 인자 템플릿 특수화 오류 : 비 추론 될 템플릿 매개 변수

template<typename ... Args> struct seq{}; 
template<typename Seq, size_t c = 1> struct pop_back; 

template<typename ... Args> struct pop_back <seq<Args...>, 0>{ 
    typedef seq<Args...> type; 
}; 
template<typename ... Args, typename T, size_t c> struct pop_back <seq<Args..., T>, c>{ 
    typedef typename pop_back<seq<Args...>, c - 1>::type type; 
}; 

을 나는 오류가 있어요 : 클래스 템플릿 부분 특수화는 템플릿 매개 변수 될 수 없습니다 포함을 추론; 이 부분적인 전문화는 결코 사용되지 않을 것입니다. [-Werror]

과 같은 가변적 인 템플릿을 전문화 한 것 같습니다. gcc 4.8.2와 vc 2013은 성공적으로 컴파일 할 수 있습니다. 위와 같이 pop_back을 정의하면 gcc와 vc가 모두 전달됩니다. pop_back을 인스턴스화하면 모두 실패합니다.

내 코드가 비표준입니까? 이 문제를 해결하는 방법은 무엇입니까?

+0

하드 말, 우리가 seq'가 무엇인지'아무 생각이 없기 때문에. – WhozCraig

+0

seq 정의가 누락되었습니다. 그것을 추가했습니다. – wingfire

답변

3

T은 컴파일러가 인수 팩 Args...의 끝을 판별 할 수 없기 때문에 추론 할 수 없습니다. 다른 구현이 필요합니다. 이것은 c이 감소하는 동안 시퀀스의 개별 요소를 연결합니다.

namespace detail 
{ 
template <typename S1, typename S2> 
struct concat_impl; 

template <typename... Ts, typename... Us> 
struct concat_impl<seq<Ts...>, seq<Us...>> 
{ 
    using type = seq<Ts..., Us...>; 
}; 

template <typename S1, typename S2> 
using concat = typename concat_impl<S1, S2>::type; 

template <typename Seq, size_t c = 1, typename = void> 
struct pop_back; 

template <typename T, typename... Args, size_t c> 
struct pop_back<seq<T, Args...>, c, typename std::enable_if<c!=0>::type> 
{ 
    using type = concat<seq<T>, typename pop_back<seq<Args...>, c-1>::type>; 
}; 

template <typename... Args> 
struct pop_back<seq<Args...>, 0> 
{ 
    using type = seq<>; 
}; 
} // detail 

template <typename Sequence, size_t c> 
struct pop_back; 

template <typename... Args, size_t c> 
struct pop_back<seq<Args...>, c> : detail::pop_back<seq<Args...>, sizeof...(Args) - c> 
{ }; 

Live Demo

+0

누군가가'enable_if'를 사용하지 않는 버전을 제안 할 수 있다면, 많은 도움이 될 것입니다. – 0x499602D2

+0

나는이 질문을 어딘가에 저장해야하고'Args ..., T'가 추론 될 수있는 유효한 이유로 제기해야한다. (왜냐하면 심각하게하기 때문에이 이유는 유일하지 않은 이유로 " ] 사례를 사용하고 복잡성을 증가시킬뿐입니다. "). – Griwes

+0

당신이 옳습니다. 나는 C++ 표준을 오해했다. 제 이해가 정확하다면, 예를 들어 c가 1이고 Seq이 Seq 인 경우 concat이 예상대로 작동하지 않습니다. 어쨌든, 나는 당신의 솔루션의 요점을 파악하고, 나는이 문제의 나머지 부분을 마칠 수있다. 대단히 감사합니다! – wingfire

관련 문제