2014-02-13 65 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文件,否则模板将不能被实例化。