【发布时间】:2014-07-23 19:41:43
【问题描述】:
在寻找另一个question 的答案时,我开发了一个辅助类,它可以处理任何类型的整数容器。具体来说,我的班级将根据某些标准查找容器值。为了使用不同类型的容器,我的课程显然不需要对容器本身进行操作,而是对其迭代器进行操作。我不需要在我的类中的任何地方引用容器,我只使用迭代器并且只在类构造函数中使用。
// 头文件。
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)”,引用自:...
知道我做错了什么吗?
【问题讨论】:
-
模板不能不在 .cpp 文件中。将文件的实现放在.hpp中。
-
你需要将实现放在类定义所在的头文件中。
-
@NetVipeC +1 表示他的问题,但这是不准确的。模板通常不在 C++ 文件中,因为它们需要在构建时完整实现。但是导出的模板特化和仅在一个编译单元中需要的模板可以在 C++ 文件中。它非常罕见。
-
@NetVipeC 好吧,更具体地说,模板声明和定义必须驻留在同一个文件中。所以如果你想在多个地方使用它,都需要在标题中。
-
@aruisdante "same file" ==> "same translation unit",我同意(无法承受显式实例化,这是 方式这个OP的问题)。