比较字符串的模板

Template for comparing strings

本文关键字:字符串 比较      更新时间:2023-10-16

我试图写我自己的模板比较字符串,但我不能弄清楚,它应该如何工作,虽然我已经走过了一些教程。我在编译期间仍然得到这个错误,我不知道,如何修复它:unreference to CSearch<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::equal_to<char> >::Add(int, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)

这是我目前为止写的:

template <typename _Type, typename _Comparator = std::equal_to<typename _Type::value_type> >
    class CSearch {
 public:
// default constructor
CSearch() : cmp(_Comparator()) {
};
// constructor with comparator parameter
CSearch(const _Comparator &_cmp) : cmp(_cmp) {
};
// destructor (if needed)
~CSearch() {
};
void Add(int id,
        const _Type & needle);
set<int> Search(const _Type & hayHeap) const;
_Comparator cmp;
 private:
// empty copy constructor
// empty operator =
};

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(int argc, char** argv) {
CSearch <string> test1;
test1 . Add(0, "hello");
test1 . Add(1, "world");
test1 . Add(2, "rld");
test1 . Add(3, "ell");
test1 . Add(4, "hell");
return 0;
CSearch <string, bool (*)(const char &, const char &)> test2 ( upperCaseCompare );
test2 . Add    ( 0, "hello" );
test2 . Add    ( 1, "world" );
test2 . Add    ( 2, "rld" );
test2 . Add    ( 3, "ell" );
test2 . Add    ( 4, "hell" );
printSet ( test2 . Search ( "HeLlO WoRlD!" ) );
// 0, 1, 2, 3, 4
printSet ( test2 . Search ( "hallo world!" ) );
// 1, 2
CSearch <string, CharComparator> test3 ( CharComparator ( false ) );
test3 . Add    ( 0, "hello" );
test3 . Add    ( 1, "world" );
test3 . Add    ( 2, "rld" );
test3 . Add    ( 3, "ell" );
test3 . Add    ( 4, "hell" );
printSet ( test3 . Search ( "heLLo world!" ) );
// 0, 1, 2, 3, 4
printSet ( test3 . Search ( "Well, templates are hell" ) );
// 3, 4
CSearch <vector<int> > test4;
static const int needleA [] = { 1, 6, 1, 6, 9, 12 };
static const int needleB [] = { 9, 12, 7 };
static const int hayHeap [] = { 1, 6, 1, 6, 1, 6, 9, 12, 8 }; 
test4 . Add    ( 0, makeVector ( needleA ) );
test4 . Add    ( 1, makeVector ( needleB ) );
printSet ( test4 . Search ( makeVector ( hayHeap ) ) );
// 0
CSearch <vector<string> > test5;
static const string needleX  [] = { "Prague", "Bern", "Rome" };
static const string needleY  [] = { "London", "Prague", "Bern" };
static const string needleZ  [] = { "London", "Rome" };
static const string cityHeap [] = { "Berlin", "London", "Prague", "Bern", "Rome", "Moscow" }; 
test5 . Add    ( 0, makeVector ( needleX ) );
test5 . Add    ( 1, makeVector ( needleY ) );
test5 . Add    ( 2, makeVector ( needleZ ) );
printSet ( test5 . Search ( makeVector ( cityHeap ) ) );
// 0, 1
}

你能告诉我,如何定义模板,以能够处理所有的类型,我已经声明在main

这是你错误的重要部分。

Undefined reference to CSearch<...>::Add(int, std::basic_string<...> ) const&

这意味着您的代码引用到CSearch中的一些函数,看起来像这样:

void Add(int id, const _Type & needle);

但是这个函数似乎没有定义

如果您在其他源文件中定义了in,请将其移动到头文件