我已经创建了自己的阻塞队列,但我在弄清楚为什么会出现链接器错误时遇到了一些麻烦(注意这是 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
中找到任何其他方法)。有什么想法吗?
最佳答案
是模板
,必须把实现放在BlockingQueue.h里面
有一段时间,标准确实
提供关键字 export
以允许这样一个单独的实现文件。但不多
供应商实现了它。 C++11 停止使用 export 但保留了 export
将来可能使用的关键字。)
模板必须与特定请求结合使用 模板的实例化。
关于c++ - 具有自定义阻塞队列实现的未解析外部符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13353051/