0

我创建了自己的阻塞队列,但在弄清楚为什么会出现链接器错误时遇到了一些麻烦(注意这是 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)。有任何想法吗?

4

1 回答 1

3

是的template,你必须把实现放在 BlockingQueue.h

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

模板必须与对特定模板实例化的请求结合使用。

于 2012-11-12T23:06:31.617 回答