2013-08-22 62 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

相关问题