首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >链接器错误:未解析的外部符号

链接器错误:未解析的外部符号
EN

Stack Overflow用户
提问于 2013-08-23 02:44:13
回答 2查看 92关注 0票数 0

我正在尝试创建一个模板c++堆栈,但我遇到了一些链接器的问题。我试着把所有的类都放到一个cpp文件中,它工作得很好,但是一旦我把它们分到不同的文件中,问题就开始了。

主类:

代码语言:javascript
复制
#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:

代码语言:javascript
复制
#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:

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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
EN

回答 2

Stack Overflow用户

发布于 2013-08-23 02:47:20

将模板类函数的所有定义放在.h中。它们基本上不允许放在单独的文件中。

这是因为模板不像典型的类。编译器将在模板实例化的基础上为您生成一个类。因此,编译器需要知道在哪里查找函数定义,因此将它们放在定义类的.h中。

票数 1
EN

Stack Overflow用户

发布于 2013-08-23 02:50:25

模板函数只有在被专门化(使用)之后才会被编译,而且您的stack.cpp不会生成任何机器码。将它们移动到stack.h

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18388472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档