我正在尝试创建一个模板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发布于 2013-08-23 02:47:20
将模板类函数的所有定义放在.h中。它们基本上不允许放在单独的文件中。
这是因为模板不像典型的类。编译器将在模板实例化的基础上为您生成一个类。因此,编译器需要知道在哪里查找函数定义,因此将它们放在定义类的.h中。
发布于 2013-08-23 02:50:25
模板函数只有在被专门化(使用)之后才会被编译,而且您的stack.cpp不会生成任何机器码。将它们移动到stack.h
https://stackoverflow.com/questions/18388472
复制相似问题