未解决的模板外部

时间:2012-12-22 13:02:52

标签: c++ templates visual-studio-2012

  

可能重复:
  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两次(认为链接器坏了),但问题一直在出现。

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

有更优雅的方式吗?

2 个答案:

答案 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,你根本不需要一个包含守卫。