Неразрешенный внешний символ с пользовательской реализацией очереди блокировки

Я создал собственную очередь блокировки, и у меня возникли проблемы с выяснением причины ошибки компоновщика (обратите внимание, это приложение Qt в Visual Studio 2010):

#ifndef BLOCKING_QUEUE_H
#define BLOCKING_QUEUE_H

#include <QObject>
#include <QSharedPointer>
#include <QWaitCondition>
#include <QMutex>
#include <queue>

namespace TestingNS
{
template<typename Data>
class BlockingQueue
{
private:
std::queue<QSharedPointer<Data>> _queue;
QMutex _mutex;
QWaitCondition _monitor;
volatile bool _closed;

public:
BlockingQueue();

void Close();

size_t Size();

void Empty();

bool IsClosed();

bool Enqueue(QSharedPointer<Data> data);

bool TryDequeue(QSharedPointer<Data>& value, unsigned long time = ULONG_MAX);
};
}
#endif //BLOCKING_QUEUE_H

Реализация немного длиннее, поэтому у меня есть кое-что для этого: http://pastie.org/5368660

Точка входа в программу выглядит так:

#include <QtCore/QCoreApplication>
#include <QTimer>
#include <iostream>
#include "BlockingQueue.h"
using namespace std;
using namespace TestingNS;

class Item
{

};

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

BlockingQueue<Item> queue;

cout << "Press any key to exit!" << endl;

char in;
cin.get(in);
QTimer::singleShot(0, &a, SLOT(quit()));

return a.exec();
}

Я получаю ошибку компоновщика:

Error   1   error LNK2019: unresolved external symbol "public: __thiscall TestingNS::BlockingQueue<class Item>::BlockingQueue<class Item>(void)" (??0?$BlockingQueue@VItem@@@TestingNS@@QAE@XZ) referenced in function _main

Я не понимаю, почему компоновщик не может найти конструктор (или любой другой метод из BlockingQueue). Есть идеи?

0

Решение

Это template, вы должны поместить реализацию в BlockingQueue.h

Некоторое время стандарт делал
предоставить ключевое слово export разрешить такой отдельный файл реализации. Но не много
поставщики реализовали это. C ++ 11 прекращает использование экспорта, но оставляет за собой export
ключевое слово для возможного использования в будущем.)

Шаблоны должны использоваться вместе с запросами
экземпляры шаблонов.

3

Другие решения

Других решений пока нет …