未解决的外部符号,具有自定义阻塞队列实现

Unresolved external symbol with custom blocking queue implementation

本文关键字:自定义 队列 实现 外部 符号 未解决      更新时间:2023-10-16

我创建了自己的阻止队列,我在弄清楚为什么会收到链接器错误时遇到了一些麻烦(请注意,这是Visual Studio 2010中的QT应用程序):

#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中的任何其他方法)。有什么想法吗?

template,您必须将实现放置在blockingqueue.h

一段时间,标准确实提供关键字export以允许这样的单独的实现文件。但是没有多少供应商实施了它。C 11使用导出但保留export的停用供未来可能使用的关键字。)

模板必须与特定的请求一起使用模板的实例。