0

可能重复:
为什么在使用模板时会出现“未解析的外部符号”错误?

我正在尝试使用模板实现一个通用队列。

我的标题中有以下代码:

template<class Item>
class Queue{
protected:
    struct linked_list;
    int size;
public:
    Queue();
    Queue(Item T);
};

我有一个 Queue.cpp:

template<class Item>
Queue<Item>::Queue()
{

}
template<class Item>
Queue<Item>::Queue(Item T)
{

}

但是每次编译时,由于未解决的外部问题,我都会收到链接器错误。

我重新安装了 VS2012 两次(认为链接器已损坏),但问题不断出现。

我读到在使用模板时函数实现在单独的文件中存在一些问题,但除了将实现放在标题中之外,我没有看到任何解决方案。

有没有更优雅的方式来做到这一点?

4

2 回答 2

2

模板不支持a definition is provided elsewhere and creates a reference (for the linker to resolve) to that definition

您需要使用the inclusion model,将所有 Queue.cpp 定义放入 Queue.h 文件中。或者在 Queue.h 的底部

#include "Queue.cpp"
于 2012-12-22T13:04:23.470 回答
0

模板声明必须完整地包含在您的源代码中。如果要拆分它们,我更喜欢使用的一种方法是:

在 queue.h 的底部:

#define QUEUE_H_IMPL
#include "queue_impl.h"

并在 queue_impl.h

//include guard of your choice, eg:
#pragma once

#ifndef QUEUE_H_IMPL
#error Do not include queue_impl.h directly. Include queue.h instead.
#endif

//optional (beacuse I dont like keeping superfluous macro defs)
#undef QUEUE_H_IMPL

//code which was in queue.cpp goes here

实际上现在在我看过它之后,如果你#undef QUEUE_H_IMPL.

于 2012-12-22T13:10:24.223 回答