可能重复:
Why do I get “unresolved external symbol” errors when using templates?
我正在尝试使用模板实现通用队列。
我的标题中包含以下代码:
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两次(认为链接器坏了),但问题一直在出现。
我读到在使用模板时函数实现在单独的文件中存在一些问题,但我没有看到任何解决方案,除了将实现放在标题中。
有更优雅的方式吗?
答案 0 :(得分: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"
答案 1 :(得分: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
,你根本不需要一个包含守卫。