我有一个函数,它将从队列中弹出任务代码并在任务代码和任务(方法)的映射中搜索它,并将匹配的任务推送到另一个队列,我想弹出并稍后执行。以下是功能:
do_something(c, by_value{}); // value
do_something(c, by_ref{}); // reference
下面是定义此函数类的标题:
void CertManMgmtEECertController::PrepareTask()
{
while(_taskCodeQueue.empty())
{
_taskQueue.push((_taskStore.find(_taskCodeQueue.pop()))->second);
}
}
但是我在编译时遇到以下错误:
class CertManMgmtEECertController : public virtual CertManMgmtCertificate
{
public:
CertManMgmtEECertController();
~CertManMgmtEECertController();
void PerformTask();
void SetTask(CertManMgmtEETaskCode taskCode);
typedef void (CertManMgmtEECertController::*Task)();
private:
CertManMgmtEETaskCode _task;
queue<Task> _taskQueue;
queue<CertManMgmtEETaskCode> _taskCodeQueue;
map<CertManMgmtEETaskCode,Task> _taskStore;
void LoadTasks();
void PrepareTask();
void ExecuteTaskQueue();
void GetEECert();
bool GetCertificate();
};
我哪里错了?我知道这里还有其他编译错误。请帮忙。
答案 0 :(得分:3)
原则上,该问题包含足够的信息来回答for /f "tokens=2,3,4,5,6 usebackq delims=:/ " %%a in ('%date% %time%') do echo %%c-%%a-%%b %%d%%e
错误。
std::queue::pop()返回invalid use of void expression
。您在void
中想要的可能是
PrepareTask
答案 1 :(得分:0)
一个好的经验法则是 从第一条错误消息开始 。
在你的情况下是
CertManMgmtDomainController.h:49: error: 'CertManMgmtEECertController' does not name a type
可能你有一个拼写错误,可能标题不包含在实现文件中,可能标识符已被重新定义为函数,无论如何。但从这开始。忽略其余的错误:它们很可能可能由第一个引起。
编辑:完成上述操作后,我在another answer中看到您正在使用std::queue
,实际上,其pop
方法返回{ {1}}。这是为了例外安全。 no convenience method结合了void
和pop
。
关于拼写错误的可能性,请注意
现代IDE(如Visual Studio)提供有关标识符的工具提示,
C ++提供名称空间以更实际的方式处理公共前缀。
答案 2 :(得分:0)
查看是否在namespace
帮助中添加typedef
。
typedef void (certman::CertManMgmtEECertController::*Task)();