[英]full template specialization not working: no instance of function template “mysort2” matches the specified type STLTests
我正在嘗試創建功能模板的完全專業化:
#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>,int,std :: allocator <_Ty >>(std :: list <_Ty,std :: allocator <_Ty >>&)'不是函數模板的專業化
問題:
1)可以做到嗎? 怎么樣? 2)據斯科特·邁耶斯(Scott Meyers)所述,不應鼓勵功能模板專門化。 這個建議在這里適用嗎? 3)推薦的模式是什么?
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(); }
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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.