非模板类的模板构造函数的问题

Trouble with template constructor of non-template class

本文关键字:问题 构造函数      更新时间:2023-10-16

在寻找另一个问题的答案时,我开发了一个助手类,它可以处理任何类型的整数容器。具体来说,我的类将根据某些标准查找容器值。为了处理不同类型的容器,我的类显然需要操作的不是容器本身,而是它们的迭代器。我不需要在类的任何地方引用容器,我只使用迭代器,并且只在类的构造函数中使用。

//头文件。

 class MyLookup {
    public: 
    template<typename ForwardIt>   // Forward iterator though sequence of integers
    MyLookup(ForwardIt begin, ForwardIt end)
    ...
 }

//实现文件

 template<typename ForwardIt>
 MyLookup::MyLookup(ForwardIt begin, ForwardIt end) {
 ...
 }

//使用文件

std::vector<int> foo;
...
MyLookup lookup(foo.begin(), foo.end());

当使用CLang时,初始编译器通过成功,但随后我得到链接器错误:

架构x86_64的未定义符号:"MyLookup: MyLookup> (std:: __1:: __wrap_iter, std:: __1:: __wrap_iter)",引用:…

你知道我做错了什么吗?

您需要在头文件中提供模板的定义,而不是在它们自己的源文件中。这是因为模板实际上是类定义的模板——它们本身并不是类定义。