2012-11-12 182 views
0

我已經創建了自己的阻塞隊列,我遇到了一些麻煩搞清楚爲什麼我得到一個鏈接錯誤(注意這是一個Qt應用程序在Visual Studio 2010):解析外部符號

#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 

的實現是多一點的時間,所以我有一個pastie它: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)" ([email protected]@@@[email protected]@[email protected]) referenced in function _main 

我不明白爲什麼鏈接器無法找到構造函數(也不是來自BlockingQueue任何其他方法)。有任何想法嗎?

+0

BlockingQueue的實現在哪裏? – imreal

+2

看起來像另一個受騙者爲[爲什麼模板只能在頭文件中實現?(http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-文件)。 –

+0

@Nick在我的問題中看到了pastie鏈接。 – Kiril

回答

3

這是template,你必須把實現內部BlockingQueue.h

有一段時間,標準的確 提供關鍵字export允許這樣一個單獨的實現文件。但並不是很多供應商實施了它。 C++ 11中止在使用出口的,但保留爲將來可能使用的export 關鍵字。)

模板具有在結合使用與特定的模板 實例請求。