【发布时间】:2017-09-12 16:54:07
【问题描述】:
我有一个像下面这样的线程安全队列类,
类 CmdQ:
template <typename Q>
class CmdQ
{
public:
CmdQ() :
queue_(),
queueMutex_(){};
~CmdQ() {
while (!queue_.empty()) {
Q* element(std::move(this->queue_.front()));
this->queue_.pop();
delete element;
}
};
void push(Q* commands) {
std::unique_lock<std::mutex> lock(this->queueMutex_);
queue_.push(commands);
this->mutexCondition_.notify_all();
}
void pop() {
std::unique_lock<std::mutex> lock(this->queueMutex_);
while(this->queue_.empty())this->mutexCondition_.wait(lock);
Q* element(std::move(this->queue_.front()));
this->queue_.pop();
delete element;
}
Q* front() {
std::unique_lock<std::mutex> lock(this->queueMutex_);
while(this->queue_.empty())this->mutexCondition_.wait(lock); if (!queue_.empty()) {
return (queue_.front());
}
return NULL;
}
bool empty() {
std::unique_lock<std::mutex> lock(this->queueMutex_);
return queue_.empty();
}
void clear() {
std::unique_lock<std::mutex> lock(this->queueMutex_);
while (!queue_.empty()) {
Q* element(std::move(this->queue_.front()));
this->queue_.pop();
delete element;
}
}
unsigned int size() {
std::unique_lock<std::mutex> lock(this->queueMutex_);
return queue_.size();
}
private:
std::queue queue_;
std::mutex queueMutex_;
std::condition_variable mutexCondition_;
};
现在,我希望这个队列包含列表。所以,我使用如下:
ClassB.h:
template<typename std::list<Message*>>
class CmdQ;
CmdQ<std::list<Message*>>* msgListQ_;
但是,我不断收到以下错误:
错误 1 错误 C2993: 'std::list<_ty>' : 非类型的非法类型 模板参数'__formal'
错误 3 错误 C2975:“CmdQ”:模板参数无效 '未命名参数',预期的编译时常量表达式
我参考了一些文档,模板类型不能接受std::list,但会接受指向列表的指针,因此也尝试在 ClassB.h 中使用指向列表的指针,如下所示:
template<typename std::list<Message*>*>
class CmdQ;
CmdQ<std::list<Message*>*>* msgListQ_;
但我仍然面临错误。
感谢任何帮助。
谢谢!
【问题讨论】:
-
不应该
std::queue queue_;是std::queue<Q> queue_;? -
无论如何您都不需要显式实例化。你可以只使用模板来声明你的变量。
-
@NathanOliver
std::queue<Q*> queue,而不是 -
template<typename std::list<Message*>> class CmdQ;是来自外太空的语法。为什么你认为你需要这条线?