[英]c++ Setting equal_to as a default template argument for template class
您應該如何將通用 class 設置為默認模板參數? 我已經設法編譯非泛型類,但不是泛型類。
using namespace std;
template <typename T, typename Cmp = std::equal_to<T> >
class CSearch
{
public:
CSearch(){
MComp = equal_to<T>();
}
CSearch(Cmp compare){
MComp = compare;
}
//more functions
private:
Cmp MComp;
//more
};
T 是具有迭代器的任何數據類型
Cmp 應該是二進制謂詞函數/函子/lambda function。 Cmp 是這樣調用的:
MComp(*it2,*it3);
現在有了這個主要的 function,代碼就可以工作了。 請注意,除了非泛型之外, CharComparator 與 equal_to 並沒有什么不同。
class CharComparator
{
public:
CharComparator ( bool caseSensitive = true )
: m_CaseSensitive ( caseSensitive )
{
}
bool operator () ( const char & a, const char & b ) const
{
return m_CaseSensitive ? a == b : toupper (a) == toupper (b);
}
private:
bool m_CaseSensitive;
};
int main(){
CSearch <string, CharComparator> test3 ( CharComparator(false) );
//functions,calling Cmp
}
但是當 Cmp 被調用時,這個不會編譯:
int main(){
CSearch <string> test1;
//functions,calling Cmp
}
這是編譯器錯誤。
test.cpp: In instantiation of 'bool CSearch<T, Cmp>::SearchFragment(const T&, const T&) const [with T = std::__cxx11::basic_string<char>; Cmp = std::equal_to<std::__cxx11::basic_string<char> >]':
test.cpp:88:6: required from 'std::set<int> CSearch<T, Cmp>::Search(const T&) const [with T = std::__cxx11::basic_string<char>; Cmp = std::equal_to<std::__cxx11::basic_string<char> >]'
test.cpp:130:3: required from here
test.cpp:60:3: error: no match for call to '(const std::equal_to<std::__cxx11::basic_string<char> >) (const char&, const char&)'
60 | if(MComp(*it2,*it3)){
| ^~
In file included from /usr/include/c++/9.3/string:48,
from /usr/include/c++/9.3/bits/locale_classes.h:40,
from /usr/include/c++/9.3/bits/ios_base.h:41,
from /usr/include/c++/9.3/ios:42,
from /usr/include/c++/9.3/ostream:38,
from /usr/include/c++/9.3/iostream:39,
from test.cpp:5:
/usr/include/c++/9.3/bits/stl_function.h:355:7: note: candidate: 'constexpr bool std::equal_to<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = std::__cxx11::basic_string<char>]'
355 | operator()(const _Tp& __x, const _Tp& __y) const
| ^~~~~~~~
/usr/include/c++/9.3/bits/stl_function.h:355:29: note: no known conversion for argument 1 from 'const char' to 'const std::__cxx11::basic_string<char>&'
355 | operator()(const _Tp& __x, const _Tp& __y) const
| ~~~~~~~~~~~^~~
這行錯誤說明了問題所在:
error: no match for call to '(const std::equal_to<std::__cxx11::basic_string<char> >) (const char&, const char&)'
您嘗試調用std::equal_to<std::string>
的實例來比較兩個字符,但std::equal_to<std::string>
比較字符串。
您想要std::equal_to< typename T::value_type>
而不是std::equal_to<T>
因為您正在比較字符而不是字符串(或者當T
是容器類型時的一般元素)。
你也不應該分配MComp = equal_to<T>();
在默認構造函數中。 如果Cmp
不是equal_to<T>
,則默認構造函數將不起作用。 您應該改為使用Cmp
類型的默認實例初始化MComp
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.