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