не удается вызвать шаблон класса, C ++ - PullRequest
1 голос
/ 19 сентября 2011

Я определил класс шаблона следующим образом (предоставив файл .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 ]

4 голосов
/ 19 сентября 2011

Есть ли у вас содержимое вашего конструктора и функций в файле .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;
};

По этой причине, посмотрите здесь .

0 голосов
/ 19 сентября 2011

Вам нужно, чтобы все определения функций вашего шаблона содержались в файле заголовка, а не в файле CPP - это в основном потому, что определение шаблона будет использоваться несколько раз для создания нескольких типов в зависимости от того, какие параметры вы передаете ему как введите параметры вокруг вашего кода. Единственные функции, связанные с шаблоном, которые когда-либо должны быть определены в файле CPP, - это функции специализации шаблонов - те, в которых вы хотите явно указать (если пользователь передал тип A и B, то сделайте это специально вместо действия по умолчанию).

0 голосов
/ 19 сентября 2011

Я почти уверен, что вы просто забыли добавить файл в процесс компиляции. Будьте осторожны с ошибкой, так как это может вызвать общую боль.

Всякий раз, когда у вас есть разные модули компиляции (например, классы, каждый со своим .h / .cpp), ваши классы должны знать интерфейсы, причину, по которой вы обычно включаете заголовочные файлы, но компилятор также должен знать реализации, чтобы он мог связать ваш двоичный файл.

Таким образом, вам нужно будет вызвать компилятор, передав ему все файлы .cpp в вашем проекте, иначе он не сможет сообщить вам, что вы ссылаетесь на неосуществленные фрагменты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...