完整模板特化不起作用:没有函数模板“mysort2”的实例匹配指定的类型STLTests

时间:2017-01-31 22:06:40

标签: c++ templates

我正在尝试创建功能模板的完全专业化:

#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)推荐的模式是什么?

2 个答案:

答案 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();
}