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; 
}; 

和我收到一個錯誤:類模板部分特例包含模板參數 不能推導出;這部分專業化將永遠不會使用[ - 錯誤]

似乎我專門錯誤的方式的可變參數模板,但gcc 4.8.2和vc 2013可以成功地編譯它。如果我只是像上面那樣定義pop_back,那麼就會傳遞gcc和vc。如果我實例化pop_back,所有這些都失敗了。

我的代碼是不是標準的?如何爲此編寫解決方法?

+0

甚難,因爲我們不知道什麼'seq'是。 – WhozCraig 2014-09-28 03:48:38

+0

我錯過了seq的定義。添加它。 – wingfire 2014-09-28 09:50:04

回答

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 2014-09-28 04:46:54

+0

我必須將這個問題保存在某個地方,並將其作爲允許推導出'Args ...,T'的正當理由提出來(因爲嚴重的是,這個被拒絕的唯一原因是「因爲它沒有[很多? ]用例,並會增加複雜性「)。 – Griwes 2014-09-28 09:57:52

+0

你說得對。我誤解了C++標準。如果我的理解是正確的,你的concat不能按預期工作,例如,如果c是1並且Seq是Seq 。無論如何,我抓住你的解決方案的重點,我可以完成這個問題的其餘部分。萬分感謝! – wingfire 2014-09-28 10:04:55