2014-02-13 101 views
0

此代碼存在問題,我無法理解它。 似乎問題發生在鏈接階段,因爲我google了,但在我的情況下,我認爲我的代碼有問題,而不是在工具鏈中,但我試圖在數小時和數小時後解決不了。如果你幫我糾正錯誤,我會很高興。 我正在使用Code :: Blocks和最新版本的MinGW。無法解決「未定義的參考...」錯誤

的main.cpp

#include <iostream> 
#include <string> 
#include "threadsafequeue.hpp" 
using namespace std; 

int main(){ 
    threadsafe_queue<string> Q; 
    threadsafe_queue<string> X; 
    X.empty(); 
    try{ 
     string s; 
    }catch(empty_queue ex){ 
     cout << ex.what() << endl; 
    } 
    return 0; 
} 

threadsafe_queue.cpp

#include "threadsafe_queue.hpp" 

template <typename T> 
threadsafe_queue<T>::threadsafe_queue(const threadsafe_queue& other){ 
    std::lock_guard<std::mutex> lock(other.m); 
    threadsafe_queue<T>::data = other.data; 
} 

template <typename T> 
void threadsafe_queue<T>::push(T new_value){ 
    std::lock_guard<std::mutex> lock(threadsafe_queue<T>::m); 
    threadsafe_queue::data.push(new_value); 
} 

template <typename T> 
std::shared_ptr<T> threadsafe_queue<T>::pop(){ 
    std::lock_guard<std::mutex> lock(threadsafe_queue<T>::m); 
    if(data.empty()) throw empty_queue(); 
    std::shared_ptr<T> const res(std::make_shared<T>(threadsafe_queue<T>::data.front())); 
    threadsafe_queue<T>::data.pop(); 
    return res; 
} 

template <typename T> 
void threadsafe_queue<T>::pop(T& value){ 
    std::lock_guard<std::mutex> lock(threadsafe_queue::m); 
    if(data.empty()) throw empty_queue(); 
    value = threadsafe_queue::data.front(); 
    threadsafe_queue::data.pop(); 
} 

template <typename T> 
bool threadsafe_queue<T>::empty(){ 
    std::lock_guard<std::mutex> lock(threadsafe_queue<T>::m); 
    return threadsafe_queue<T>::data.empty(); 
} 

threadsafe_queue.hpp

#include <exception> 
#include <memory> 
#include <mutex> 
#include <queue> 

#ifndef THREADSAFE_QUEUE_HPP_INCLUDED 
#define THREADSAFE_QUEUE_HPP_INCLUDED 

struct empty_queue : std::exception 
{ 
    virtual const char * what() const throw() 
    { 
     return "The Queue is Empty."; 
    }; 
}; 

template <typename T> 
class threadsafe_queue 
{ 
private: 
    std::queue<T> data; 
    mutable std::mutex m; 
public: 
    threadsafe_queue() {}; 
    threadsafe_queue(const threadsafe_queue& other); 

    threadsafe_queue& operator= (const threadsafe_queue&) = delete; 

    void push(T new_value); 

    std::shared_ptr<T> pop(); 

    void pop(T& value); 

    bool empty(); 
}; 

#endif // THREADSAFE_QUEUE_HPP_INCLUDED 

和錯誤是:

... \ ThreadSafeQueue \ main.cpp | 9 |未定義的參考 `threadsafe_queue :: empty()'|

回答

4

將所有內容從threadsafe_queue.cpp移動到threadsafe_queue.hpp

Why can templates only be implemented in the header file?

或者,如果你想聲明和實現的模板被分離,重命名threadsafe_queue.cppthreadsafe_queue.tpp(不是真的需要,只是爲了更好的清晰度),並且包括它在threadsafe_queue.hpp文件的末尾。

1

您必須在main.cpp中還包括您的實現文件:

threadsafe_queue.cpp 

實際上你的模板必須。定義在您threadsafe_queue.hpp文件,否則模板將不能被實例化。