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

时间:2012-11-12 23:03:09

标签: c++ qt linker-errors blockingqueue

我已经创建了自己的阻塞队列,但是我在弄清楚为什么会出现链接器错误(请注意这是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中的任何其他方法)。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

它是template,您必须将实现放在BlockingQueue.h

有一段时间,标准做了 提供关键字export以允许这样一个单独的实现文件。但并不多 供应商实施了它。 C ++ 11停止使用导出但保留export 关键字以备将来使用。)

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