编译错误:无效使用void表达式

时间:2015-06-28 12:10:45

标签: c++

我有一个函数,它将从队列中弹出任务代码并在任务代码和任务(方法)的映射中搜索它,并将匹配的任务推送到另一个队列,我想弹出并稍后执行。以下是功能:

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();
};

我哪里错了?我知道这里还有其他编译错误。请帮忙。

3 个答案:

答案 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结合了voidpop

关于拼写错误的可能性,请注意

  • 现代IDE(如Visual Studio)提供有关标识符的工具提示,

  • C ++提供名称空间以更实际的方式处理公共前缀。

答案 2 :(得分:0)

查看是否在namespace帮助中添加typedef

 typedef void (certman::CertManMgmtEECertController::*Task)();