C++ 未能调用模板类c++;
我定义了这样一个模板类(提供.hpp文件):C++ 未能调用模板类c++;,c++,templates,C++,Templates,我定义了这样一个模板类(提供.hpp文件): \ifndef PERSOANLVEC\H_ #定义PERSOANLVEC_H_ #包括 使用名称空间std; 模板类PersoanlVec{ 公众: PersoanlVec(); ~PersoanlVec(); 无效推回(T); 无效擦除(int索引); PersoanlVec&operator[](内部索引); 常量PersoanlVec和运算符[](int索引)常量; 无效打印()常量; size_t size(); 私人: 向量_向量; };
\ifndef PERSOANLVEC\H_
#定义PERSOANLVEC_H_
#包括
使用名称空间std;
模板类PersoanlVec{
公众:
PersoanlVec();
~PersoanlVec();
无效推回(T);
无效擦除(int索引);
PersoanlVec&operator[](内部索引);
常量PersoanlVec和运算符[](int索引)常量;
无效打印()常量;
size_t size();
私人:
向量_向量;
};
#endif/*PERSOANLVEC___*/
现在,这个类的所有编译都正常了。当我尝试使用它时,我会
对PersoanlVec::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;
}
#包括“Person.h”
#包括“PersoanlVec.hpp”
#包括
内部主(空)
{
p1人(“约坦”);
p2人(“yaara”);
PersoanlVec*a=new PersoanlVec();//您的构造函数和函数的内容是否在.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;
};
模板类PersoanlVec{
公众:
PersoanlVec(){
//代码在这里。。。
}
~PersoanlVec(){
//代码在这里。。。
}
无效推回(T){
//代码在这里。。。
}
无效擦除(整型索引){
//代码在这里。。。
}
PersoanlVec&运算符[](内部索引){
//代码在这里。。。
}
常量PersoanlVec&运算符[](整数索引)常量{
//代码在这里。。。
}
void print()常量{
//代码在这里。。。
}
大小{
//代码在这里。。。
}
私人:
向量_向量;
};
因此,请看一看。是否在.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;
};
模板类PersoanlVec{
公众:
PersoanlVec(){
//代码在这里。。。
}
~PersoanlVec(){
//代码在这里。。。
}
无效推回(T){
//代码在这里。。。
}
无效擦除(整型索引){
//代码在这里。。。
}
PersoanlVec&运算符[](内部索引){
//代码在这里。。。
}
常量PersoanlVec&运算符[](整数索引)常量{
//代码在这里。。。
}
void print()常量{
//代码在这里。。。
}
大小{
//代码在这里。。。
}
私人:
向量_向量;
};
出于这个原因,请看一看。我很确定您忘记了将文件添加到编译过程中。请小心拼写错误,因为这可能会导致一般性的痛苦
每当您有不同的编译单元(例如,类,每个类都有其.h/.cpp)时,您的类需要知道接口,这是您通常包含头文件的原因,但编译器也需要知道实现,以便它可以将二进制文件绑定在一起
因此,您需要调用编译器,将项目中的所有.cpp文件传递给它,否则它将无法让您知道您引用的是未实现的部分。我很确定您只是忘记了将文件添加到编译过程中。请小心拼写错误,因为这可能会导致一般性问题
每当您有不同的编译单元(例如,类,每个类都有其.h/.cpp)时,您的类需要知道接口,这是您通常包含头文件的原因,但编译器也需要知道实现,以便它可以将二进制文件绑定在一起
因此,您需要调用编译器将项目中的所有.cpp文件传递给它,否则它将无法让您知道您正在引用未实现的部分。您需要将所有模板函数定义保存在头文件中,而不是保存在cpp文件中-这基本上是因为模板定义将根据您在代码中作为类型参数传递给它的参数,可以多次用于创建多个类型。在CPP文件中应该定义的唯一与模板相关的函数是模板专用化函数—您希望明确指出的那些函数(如果用户传入类型A和B,则专门执行此操作,而不是默认操作).您需要将所有模板函数定义保存在头文件中,而不是保存在CPP文件中-这基本上是因为模板定义将被多次用于创建多个类型,具体取决于您在代码中作为类型参数传递给它的参数。唯一与模板相关的函数在CPP文件中应该定义模板专门化函数-那些你想明确表示的函数(如果用户传入类型A和B,那么就专门这么做,而不是默认操作)。哇,我从来没有见过这么多一致的拼写错误。PersoanlVec
的实现在哪里?(顺便说一句,是不是打算成为PersonalVec
?)@DeadMG:coding helpers是两种类型的,我从来没有见过这么多一致的拼写错误。PersonalVec
?(顺便说一句,是不是打算成为PersonalVec
?)@DeadMG:编码帮助程序是两个折叠的。虽然这是常规类的情况,但类模板不遵循该规则。因此,请参阅w00te或我的答案。虽然这是常规类的情况,但类模板不遵循该规则。因此,请参阅w00te或我的答案。