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 将来の使用のためにキーワードを予約します。)

テンプレートは、テンプレートの特定のインスタンス化の要求と組み合わせて使用​​する必要があります。

于 2012-11-12T23:06:31.617 に答える