2013-06-26 43 views
2

使用GCC 4.7.3,我得到以下错误为什么这个可变参数模板专门化定义不能编译?

prog.cpp: In function ‘int main()’: prog.cpp:27:63: error: ‘Erase >::Result’ has not been declared

this code

template <typename... List> 
struct TypeList 
{ 
    enum 
    { 
     Length = sizeof...(List) 
    }; 
}; 

template <typename ToErase, typename... List> 
struct Erase; 

template <typename ToErase> 
struct Erase<ToErase, TypeList<>> 
{ 
    typedef TypeList<> Result; 
}; 

template <typename ToErase, typename... Head, typename... Tail> 
struct Erase<ToErase, TypeList<Head..., ToErase, Tail...>> 
{ 
    typedef TypeList<Head..., Tail...> Result; 
}; 

int main() 
{ 
    static_assert(Erase<double, TypeList<int, double, char>>::Result::Length == 2, 
    "Did not erase double from TypeList<int, double, char>"); 

    return 0; 
} 

我不明白为什么代码不会编译给我收到错误消息,因为一个类似的情况下编译干净:

​​

是否有一个标准关于不能推断元素在tw中o参数包,就像我想要做的第一块代码?

回答

3

§ 14.8.2.5(从类型中推导模板参数)第5段列出了无法推导出模板参数的上下文。有关的一个是最后一个在列表中:

— A function parameter pack that does not occur at the end of the parameter-declaration-clause.

所以:

struct Erase<ToErase, TypeList<Head..., ToErase, Tail...>> 

Head不能推导出;它不会出现在参数列表的末尾。

相反,在:

struct Append<TypeList<ToAppend...>, TypeList<List...>> 

两个ToAppendList出现在它们各自的参数列表的末端,并因此它们可以被推断出来。

相关问题