Возможный дубликат:
Почему я получаю ошибки «неразрешенный внешний символ» при использовании шаблонов?
Я пытаюсь реализовать общую очередь с помощью шаблонов.
У меня есть следующий код в моем заголовке:
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 (думая, что компоновщик был сломан), но проблема продолжает появляться.
Я читал, что есть некоторая проблема с реализацией функций в отдельном файле при работе с шаблонами, но я не видел никакого решения, кроме как поместить реализацию в заголовок.
Есть ли более элегантный способ сделать это?
Шаблон не поддерживает 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"
Шаблонные объявления должны быть включены в ваш исходный код целиком. Если вы хотите разделить их, я предпочитаю использовать один из следующих способов:
в нижней части 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
,