2017-08-25 39 views
3

我有一個相當於std::integer_sequence(我們還沒有使用C++ 14)。我也有兩個助手類,刪除或添加一個前導號碼。g ++中的變量模板部分特化「不是更專業化」7.1.1

// Sequence type  
template <typename Type, Type ... Values>          
struct Sequence                
{                    
    using value_type = Type;             
};                   

// Pop a value off of the start of a sequence         
template <class Class>              
struct SequencePop;               

template <typename Type, Type Value, Type ... Values>       
struct SequencePop<Sequence<Type, Value, Values ...>>       
{                            
    using type = Sequence<Type, Values ...>;         
};                   

// Push a value on to the start of a sequence         
template <class Class, typename Class::value_type Value>      
struct SequencePush;               

template <typename Type, Type Value, Type ... Values>       
struct SequencePush<Sequence<Type, Values ...>, Value>      
{                    
    using type = Sequence<Type, Value, Values ...>;       
};                   

SequencePop被認爲是在所有的編譯器有效我曾嘗試(克++ 6.4.1,克++ 7.1.1,鐺++ 4.0.1)。 SequencePush不能用g ++ 7.1.1編譯。錯誤消息如下。

test.cpp:24:8: error: partial specialization ‘struct SequencePush<Sequence<Type, Values ...>, Value>’ is not more specialized than [-fpermissive] 
struct SequencePush<Sequence<Type, Values ...>, Value> 
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
test.cpp:21:8: note: primary template ‘template<class Class, typename Class::value_type Value> struct SequencePush’ 
struct SequencePush; 

爲G ++ 7.1.1正確的拒絕這個代碼,如果是這樣,一個人如何告訴SequencePush是不是比主模板「更專業化」?

回答

2

應該

template <typename Type, 
      Type ... Values, 
      typename Sequence<Type, Values ...>::value_type Value> 
struct SequencePush<Sequence<Type, Values ...>, Value> 
{ 
    using type = Sequence<Type, Value, Values ...>; 
}; 

Demo

Class::value_typeSequence<Type, Values ...>Type「相關的」

+0

雖然這個作品,我不知道爲什麼OP的原代碼將無法編譯。至少部分專業化應該更專業一些,因爲它包含一個'Sequence'模板模板類。我錯過了什麼? – Curious

+0

這比我的嘗試要好得多:) – YSC

+1

@Curious:不確定正確的措辭,但是'Type'沒有比'Class :: value_type'更專門化(即使它被'Sequence'約束)。 – Jarod42

0

事實上,通用模板SequencePush由一個模板參數(Class)參數,但您的專業是由兩個(TypeValue)參數。在通用模板中,Type不是參數,因爲它是從Class中推導出來的。

一個工作,但不能令人滿意的解決辦法是:

template <class Class, typename Type, Type Value>      
struct SequencePush;               

template <typename Type, Type Value, Type ... Values>       
struct SequencePush<Sequence<Type, Values ...>, Type, Value>      
{                    
    using type = Sequence<Type, Value, Values ...>;       
};  

demo

+0

當然Jarod42的答案仍然通過類型和值進行參數化? – Bill