2013-08-22 80 views
0

我想創建一個模板C++堆棧,並且我遇到了一些鏈接器問題。 我試圖把所有的類放入一個CPP文件,它工作得很好,但問題開始,一旦我把它們分成不同的文件 這裏是我的班鏈接器錯誤:未解析的外部符號

主類:

#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 

回答

1

將模板類函數的所有定義放在.h中。他們基本上不被允許在單獨的文件中。

這是因爲模板不像典型的類。編譯器會從你的模板實例化中爲你生成一個類。因此,編譯器需要知道在哪裏查找函數定義,因此將它們放在定義類的.h中。

+0

非常感謝你,完美的答案。 –

1

模板函數在被專門化(使用)之前不會被編譯,並且您的stack.cpp不會生成任何機器代碼。移動到stack.h

相關問題