2013-08-22 3 views
0

J'essaye de créer un modèle de pile C++, et j'ai un problème avec l'éditeur de liens. J'ai essayé de mettre toutes les classes dans un seul fichier cpp, et il fonctionne très bien, mais le problème commencent une fois que je les séparer dans des fichiers différents voici mes coursErreur de liaison: symbole externe non résolu

classe principale:

#include <iostream> 
#include "stack.h" 

using namespace std; 

int main() 
{ 
    Stack<double>* st = new Stack<double>(); 
    st->push(new Data<double>(10)); 

    cout << st->pop()->getData(); 

    return 0; 
} 

stack.h:

#ifndef STACK_H 
#define STACK_H 

#include "data.h" 

template <class T> 
class Stack 
{ 
public: 
    Stack():_current(NULL){} 
    void push(Data<T>* const); 
    Data<T>* pop(); 

private: 
    Data<T>* _current; 
}; 

#endif; 

stack.cpp:

#include "stack.h" 

template <class T> 
Data<T>* Stack<T>::pop() 
{ 
    if(this->_current == NULL) 
    { 
     cout << "Empty stack." <<endl; 
     return NULL; 
    } 
    else 
    { 
     Data<T>* tmpPtr = this->_current; 
     this->_current = this->_current->getPrev(); 
     return tmpPtr; 
    } 
} 

template <class T> 
void Stack<T>::push(Data<T>* const data) 
{ 
    if(this->_current == NULL) // Empty stack; 
    { 
     _current = data; 
     _current->setPrv(NULL); 
    } 
    else 
    { 
     Data<T>* tmpPtr = this->_current; 
     this->_current = data; 
     this->_current->setPrv(tmpPtr); 
    } 
} 

data.h

#ifndef DATA_H 
#define DATA_H 

template <class T> 
class Data 
{ 
public: 
    Data(T data):_data(data){} 
    T getData() const { return this->_data; } 
    void setPrv(Data* const prev){ this->_prev = prev; } 
    Data* getPrev() const { return this->_prev; } 
private: 
    Data<T>* _prev; 
    T _data; 
}; 

#endif 

Répondre

1

Mettez toutes les définitions des fonctions de classe modèle dans le .h. Ils n'ont fondamentalement pas le droit d'être dans des fichiers séparés.

Cela se produit parce que les modèles ne sont pas comme les classes typiques. Le compilateur va générer une classe pour vous hors de votre instanciation de modèle. Pour cette raison, le compilateur doit savoir où chercher les définitions de fonctions, donc placez-les dans le fichier .h où la classe est définie.

+0

merci beaucoup, réponse parfaite. –

1

Les fonctions de modèle ne sont pas compilées tant qu'elles ne sont pas spécialisées (utilisées), et votre stack.cpp ne produit aucun code machine. Déplacez-les à stack.h