无法调用模板类,c ++

时间:2011-09-19 12:50:05

标签: c++ templates

我已经定义了一个类似的模板类(提供.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;
}

这是我第一次尝试使用模板,显然对我来说不是很清楚。我有一个没有参数的构造函数,任何想法? 谢谢!

3 个答案:

答案 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然后专门执行此操作而不是默认操作)。