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

标签 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 中找到任何其他方法)。有什么想法吗?

最佳答案

模板,必须把实现放在BlockingQueue.h里面

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

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

关于c++ - 具有自定义阻塞队列实现的未解析外部符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13353051/

相关文章:

c++ - 如何使用静态库(.a 文件)而不是一组目标文件(.o)来创建共享库

c++ - QActions是如何被删除的

qt - 如何在 PySide/PyQt 中撤消 QStandardItem 的编辑?

c++ - Qt 与 SQLite 中的静态链接问题

c++ - qt c++如何再次删除和添加小部件

linker-errors - D-Bus 链接问题

c++ - 什么是 undefined reference /未解析的外部符号错误以及如何修复它?

c++ - 介入时如何跳过VS 2008中的常见类(class)?

c++ - 使用 LLDB 检查 VSCode 中的 C++ std::set

C++ 辅助函数的多重定义