C++ 可变模板部分专业化“;“不更专业”;在g++;7.1.1

C++ 可变模板部分专业化“;“不更专业”;在g++;7.1.1,c++,c++11,variadic-templates,template-specialization,C++,C++11,Variadic Templates,Template Specialization,我有一个相当于std::integer\u序列的代码(我们还没有使用C++14)。我还有两个助手类,它们删除或添加前导数字 // Sequence type template <typename Type, Type ... Values> struct Sequence {

我有一个相当于std::integer\u序列的代码(我们还没有使用C++14)。我还有两个助手类,它们删除或添加前导数字

// 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 ...>;                          
};                                                                           
g++7.1.1拒绝此代码正确吗?如果正确,如何判断
SequencePush
不比主模板“更专业”?

应该是这样的

template <typename Type,
          Type ... Values,
          typename Sequence<Type, Values ...>::value_type Value>
struct SequencePush<Sequence<Type, Values ...>, Value>
{
    using type = Sequence<Type, Value, Values ...>;
};
模板
结构序列推送
{
使用类型=序列;
};


由于
Sequence
中的
Class::value\u type
type
不“相关”。

事实上,通用模板
SequencePush
由一个模板参数(
Class
)参数化,但您的专门化由两个参数化(
type
value
)。在常规模板中,
类型
不是一个参数,因为它是从
推导出来的

一个可行但不令人满意的解决方案是:

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 ...>;                          
};     
模板
结构序列推送;
模板
结构序列推送
{                                                                            
使用类型=序列;
};     

虽然这是可行的,但我不明白为什么OP的原始代码无法编译。至少部分专门化应该更加专门化,因为它包含一个
序列
模板类。我遗漏了什么?这比我的尝试要好得多:)@好奇:不确定正确的措辞,但是
Type
Class::value\u Type
(即使它受
Sequence
的约束)更专业化, order@Curious:在
std::set
std::vector
之间,或者在
Foo
Foo
之间,哪个更专业?->并非所有元素都具有可比性。那么,Jarod42的答案是否仍然由类型和值参数化?
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 ...>;                          
};