Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 非模板类的模板构造函数有问题_C++_Templates_C++11 - Fatal编程技术网

C++ 非模板类的模板构造函数有问题

C++ 非模板类的模板构造函数有问题,c++,templates,c++11,C++,Templates,C++11,在搜索另一个问题的答案时,我开发了一个helper类,可以处理任何类型的整数容器。具体来说,我的类将根据一些条件查找容器值。为了使用不同类型的容器,我的类显然不需要对容器本身进行操作,而需要对其迭代器进行操作。我不需要在类中的任何地方引用容器,我只使用迭代器和类内构造函数 //头文件 class MyLookup { public: template<typename ForwardIt> // Forward iterator though sequence

在搜索另一个问题的答案时,我开发了一个helper类,可以处理任何类型的整数容器。具体来说,我的类将根据一些条件查找容器值。为了使用不同类型的容器,我的类显然不需要对容器本身进行操作,而需要对其迭代器进行操作。我不需要在类中的任何地方引用容器,我只使用迭代器和类内构造函数

//头文件

 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::u 1::u wrap_iter,std::u 1::u wrap_iter,引用自:


知道我做错了什么吗?

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

模板不能位于.cpp文件中。将文件的实现放在.hpp中。您需要将实现放在类定义所在的头中。@NetVipeC+1,以说明他的问题,但这是不准确的。模板通常不在C++文件中,因为它们需要在编译时实现完全的。但是,只需在一个编译单元中导出的模板专用程序和模板就可以在C++文件中。这真是太不寻常了。@NetVipeC更具体地说,模板声明和定义必须位于同一个文件中。因此,如果您想在多个位置使用它,则需要将其全部放在标题中。@aruistante相同的文件==>相同的翻译单元,并且我同意显式实例化,这远远超出了这个OP的问题。在评论中输入三个不同的人已经输入的答案,而不添加任何额外的信息,至少可以说是糟糕的形式。对不起,但是我回答了这个问题,并提供了一些关于模板实现为什么不驻留在它们自己的源文件中的附加概念信息。所以我不明白为什么我不把它作为一个答案。将构造函数定义移动到头文件确实解决了这个问题。我可能感到困惑,因为我确实在cpp文件中定义了模板定义的实例。这些例子必须与原始问题评论中提到的案例相关。老实说,这已经是我第二次被标题/实现/模板问题绊倒了。谢谢大家。@Aruistante这并不意味着没有人能回答这个问题了。我经常想知道为什么人们会以评论的形式给出答案。