我已经定义了一个类似的模板类(提供.hpp文件):
#ifndef PERSOANLVEC_H_
#define PERSOANLVEC_H_
#include <vector>
using namespace std;
template<class T, class PrnT> class PersoanlVec {
public:
PersoanlVec();
~PersoanlVec();
void push_back(T t);
void erase(int index);
PersoanlVec& operator[](int index);
const PersoanlVec& operator[](int index) const;
void print() const;
size_t size();
private:
vector<T> _vector;
};
#endif /* PERSOANLVEC_H_ */
现在,这个类的所有内容都可以正常编译。当我尝试使用它时,我得到了
undefined reference to PersoanlVec<Person, Person>::PersoanlVec()'
。
这就是我所说的:
#include "Person.h"
#include "PersoanlVec.hpp"
#include <cstdlib>
int main(void)
{
Person p1("yotam");
Person p2("yaara");
PersoanlVec<Person,Person> *a = new PersoanlVec<Person,Person>(); //<---ERROR HERE
return EXIT_SUCCESS;
}
这是我第一次尝试使用模板,显然对我来说不是很清楚。我有一个没有参数的构造函数,任何想法? 谢谢!
答案 0 :(得分:4)
您是否在.cpp
文件中包含构造函数和函数的内容?如果是,那就是你的问题。将它们放在头文件中,可能只是在类本身内联:
template<class T, class PrnT> class PersoanlVec {
public:
PersoanlVec(){
// code here...
}
~PersoanlVec(){
// code here...
}
void push_back(T t){
// code here...
}
void erase(int index){
// code here...
}
PersoanlVec& operator[](int index){
// code here...
}
const PersoanlVec& operator[](int index) const{
// code here...
}
void print() const{
// code here...
}
size_t size(){
// code here...
}
private:
vector<T> _vector;
};
因此,请查看here。
答案 1 :(得分:0)
我很确定你忘记将文件添加到编译过程中。小心你的拼写错误,因为这可能导致一般的痛苦。
每当你有不同的编译单元(例如,每个类都带有.h / .cpp)时,你的类需要知道接口,通常包含头文件的原因,但编译器还需要知道实现,以便它可以绑定您的二进制文件。
因此,您需要调用编译器将项目中的所有.cpp文件传递给它,否则它将失败,让您知道您正在引用未实现的部分。
答案 2 :(得分:0)
您需要将所有模板函数定义保存在头文件而不是CPP文件中 - 这主要是因为模板定义将多次使用以创建多个类型,具体取决于您传递给它的参数键入代码周围的参数。应该在CPP文件中定义的唯一模板相关函数是模板特化函数 - 您要明确说明的函数(如果用户传入类型A和B然后专门执行此操作而不是默认操作)。