比较字符串的模板

时间:2013-04-15 21:09:14

标签: c++ templates

我正在尝试编写自己的模板来比较字符串,但我无法弄清楚它是如何工作的,尽管我已经完成了一些教程。我在编译期间仍然遇到此错误,我不知道如何修复它: 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中声明的所有类型?

1 个答案:

答案 0 :(得分:1)

这是您错误的重要部分。

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

这意味着您的代码引用CSearch中的某个函数,如下所示:

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

但该功能似乎没有定义

如果您已在其他一些源文件中定义了move it to the heade r。