簡體   English   中英

完全模板專業化不起作用:函數模板“ mysort2”的任何實例均與指定的類型STLTests不匹配

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM