我正在尝试创建功能模板的完全专业化:
#pragma once
#include <list>
template< template<typename T, typename A > typename C, typename T, typename A = std::allocator<T> >
void mysort2(C<T, A>& container)
{
std::sort(container.begin(), container.end());
}
template<>
void mysort2< std::list<int, std::allocator<int> >, int, std::allocator<int> >(std::list<int, std::allocator<int> >& mylist)
{
mylist.sort();
}
我收到编译错误消息:
1)没有函数模板“mysort2”的实例匹配指定的类型
2)错误C2912显式特化'void mysort2&gt;,int,std :: allocator&lt; _Ty&gt;&gt;(std :: list&lt; _Ty,std :: allocator&lt; _Ty&gt;&gt;&amp;)'不是函数的特化模板
问题:
1)可以这样做吗?怎么样? 2)根据Scott Meyers的说法,应该不鼓励功能模板专业化。这个建议适用于此吗? 3)推荐的模式是什么?
答案 0 :(得分:2)
1)可以这样做吗?怎么样?
是的,明确提供正确的类型:
template<>
void mysort2<std::list, int, std::allocator<int>>(std::list<int, std::allocator<int>>& c)
{
c.sort();
}
或简单地隐式(因为模板参数是可推导的):
template<>
void mysort2(std::list<int, std::allocator<int>>& c)
{
c.sort();
}
2)根据Scott Meyers的说法,应该不鼓励功能模板专业化。这个建议适用于此吗? 3)推荐的模式是什么?
我会说是的。
简单的超载完成了这项工作:
void sort2(std::list<int>& c) { c.sort(); }
你不能做部分专业化,但你可以有额外的重载,如:
template <typename T, typename A>
void sort2(std::list<T, A>& c) { c.sort(); }
答案 1 :(得分:1)
mysort2
的第一个参数是模板参数。因此,您需要在专业化中使用std::list
,而不是std::list<int, std::allocator<int> >
。
template<>
void mysort2< std::list, int, std::allocator<int> >(std::list<int, std::allocator<int> >& mylist)
{
mylist.sort();
}