This question already has answers here:
Why can templates only be implemented in the header file?
(16个回答)
5年前关闭。
这段代码有问题,我听不懂。
似乎是在我搜索过Google的链接阶段发生的问题,但就我而言,我认为我的代码有问题,不是在工具链中,但经过数小时的尝试,我还是无法解决。如果您能帮助我更正,我将很高兴。
我正在使用Code :: Blocks和最新版本的MinGW。
main.cpp
threadsafe_queue.cpp
threadsafe_queue.hpp
错误是:
... \ ThreadSafeQueue \ main.cpp | 9 |的未定义引用
`threadsafe_queue :: empty()'|
(16个回答)
5年前关闭。
这段代码有问题,我听不懂。
似乎是在我搜索过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()'|
最佳答案
将所有内容从threadsafe_queue.cpp
移到threadsafe_queue.hpp
。
Why can templates only be implemented in the header file?
或者,如果要分隔模板的声明和实现,请将threadsafe_queue.cpp
重命名为threadsafe_queue.tpp
(为了更好的说明,并不需要,只是为了更好),并将其包含在threadsafe_queue.hpp
文件的末尾。