«Неопределенная ссылка на» конструктор класса шаблона [дубликат]

На этот вопрос уже есть ответ:

Я понятия не имею, почему это происходит, так как я думаю, что у меня все правильно объявлено и определено.

У меня есть следующая программа, разработанная с использованием шаблонов. Это простая реализация очереди с функциями-членами «add», «substract» и «print».

Я определил узел для очереди в штрафном «nodo_colaypila.h»:

#ifndef NODO_COLAYPILA_H
#define NODO_COLAYPILA_H

#include 

template  class cola;

template  class nodo_colaypila
{
        T elem;
        nodo_colaypila* sig;
        friend class cola;
    public:
        nodo_colaypila(T, nodo_colaypila*);

};

Затем реализация в «nodo_colaypila.cpp»

#include "nodo_colaypila.h"
#include 

template  nodo_colaypila::nodo_colaypila(T a, nodo_colaypila* siguiente = NULL)
{
    elem = a;
    sig = siguiente;//ctor
}

Впоследствии, определение и объявление класса шаблона очереди и его функций:

"cola.h":

#ifndef COLA_H
#define COLA_H

#include "nodo_colaypila.h"

template  class cola
{
        nodo_colaypila* ult, pri;
    public:
        cola();
        void anade(T&);
        T saca();
        void print() const;
        virtual ~cola();

};


#endif // COLA_H

"cola.cpp":

#include "cola.h"
#include "nodo_colaypila.h"

#include 

using namespace std;

template  cola::cola()
{
    pri = NULL;
    ult = NULL;//ctor
}

template  void cola::anade(T& valor)
{
    nodo_colaypila  * nuevo;

    if (ult)
    {
        nuevo = new nodo_colaypila (valor);
        ult->sig = nuevo;
        ult = nuevo;
    }
    if (!pri)
    {
        pri = nuevo;
    }
}

template  T cola::saca()
{
    nodo_colaypila  * aux;
    T valor;

    aux = pri;
    if (!aux)
    {
        return 0;
    }
    pri = aux->sig;
    valor = aux->elem;
    delete aux;
    if(!pri)
    {
        ult = NULL;
    }
    return valor;
}

template  cola::~cola()
{
    while(pri)
    {
        saca();
    }//dtor
}

template  void cola::print() const
{
    nodo_colaypila  * aux;
    aux = pri;
    while(aux)
    {
        cout << aux->elem << endl;
        aux = aux->sig;
    }
}

Тогда, У меня есть программа для проверки этих функций следующим образом:

"main.cpp"

#include 
#include "cola.h"
#include "nodo_colaypila.h"

using namespace std;

int main()
{
    float a, b, c;
    string d, e, f;
    cola flo;
    cola str;

    a = 3.14;
    b = 2.71;
    c = 6.02;
    flo.anade(a);
    flo.anade(b);
    flo.anade(c);
    flo.print();
    cout << endl;

    d = "John";
    e = "Mark";
    f = "Matthew";
    str.anade(d);
    str.anade(e);
    str.anade(f);
    cout << endl;

    c = flo.saca();
    cout << "First In First Out Float: " << c << endl;
    cout << endl;

    f = str.saca();
    cout << "First In First Out String: " << f << endl;
    cout << endl;

    flo.print();
    cout << endl;
    str.print();

    cout << "Hello world!" << endl;
    return 0;
}

Но когда я собираю, компилятор выдает ошибки в каждом экземпляре класса шаблона:

неопределенная ссылка на `cola (float) :: cola () '... (на самом деле это cola '' :: cola (), но это не позволяет мне использовать его таким образом.)

И так далее. Всего 17 предупреждений, считая те, которые относятся к функциям-членам, вызываемым в программе.

Почему это? Эти функции и конструкторы были определены. Я думал, что компилятор может заменить «T» в шаблоне на «float», «string» или что-то еще; в этом было преимущество использования шаблонов.

Я где-то здесь прочитал, что по какой-то причине я должен поместить объявление каждой функции в заголовочный файл. Это правильно? И если так, то почему?

Заранее спасибо.

136
задан Heathcliff 6 January 2012 в 02:57
поделиться