C++函数模板全特化编译错误及模板规则疑问
第一个示例报错的核心原因
你定义的主函数模板 template<typename T,typename ...Rest> void print(List<T,Rest ...> *) 本身要求模板参数至少包含1个类型参数(必须有T,可变参数包Rest可以为空)。当你尝试对List<>*的入参做全特化时:
- 全特化
template<>的本质是给已有的主模板填充所有模板参数生成具体实例 - 但
List<>对应的入参没有可以匹配T的类型,主模板无法推导出合法的实例化参数,自然找不到可以匹配的主模板来做全特化,所以编译器报错。
而你不加template<>时,void print(List<> *)是一个独立的普通重载函数,不属于模板特化,函数重载的匹配优先级高于模板实例,递归到空List时会优先匹配这个普通函数,所以可以正常运行。
第二个示例正常编译的原因
你第二个示例里的template<typename U> void print(U *,List<> *)不是主模板的特化,而是新增的独立重载函数模板:
- 主模板
template<typename U,typename T,typename ...Rest> void print(U* , List<T,Rest ...> *)要求第二个入参是至少包含1个类型的List,无法匹配空List<>的入参 - 新增的重载模板只要求第一个入参是任意指针类型、第二个是
List<>*,刚好可以匹配递归到空List的调用,两者是重载关系不存在特化匹配失败的问题,所以可以正常编译运行。
内容的提问来源于stack exchange,提问作者Debashish
相关产品推荐
相关产品推荐

