gpt4 book ai didi

c++ - c++将equal_to设置为模板类的默认模板参数

转载 作者:行者123 更新时间:2023-12-02 10:03:07 25 4
gpt4 key购买 nike

您究竟应该如何将泛型类设置为默认模板参数?我设法使非泛型类可以编译,但没有泛型类。

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应该是Binary Predicate函数/ functor / lambda函数。
Cmp的调用方式如下:
MComp(*it2,*it3);

现在有了这个主要功能,代码就可以工作了。请注意,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>,则默认构造函数将无法工作。您应该改为使用 MComp类型的默认实例初始化 Cmp

关于c++ - c++将equal_to设置为模板类的默认模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61581657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com