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

Compilation error: invalid use of void expression

本文关键字:void 表达式 错误 无效 编译      更新时间:2023-10-16

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

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

但我在编译时得到了以下错误:

CertManMgmtDomainController.h:49: error: 'CertManMgmtEECertController' does not name a type
CertManMgmtEECertController.cpp: In member function 'void certman::CertManMgmtEECertController::PrepareTask()':
CertManMgmtEECertController.cpp:42: error: invalid use of void expression
CertManMgmtEECertController.cpp: In member function 'void certman::CertManMgmtEECertController::ExecuteTaskQueue()':
CertManMgmtEECertController.cpp:55: error: void value not ignored as it ought to be

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

原则上,问题包含足够的信息来回答invalid use of void expression错误。

std::queue::pop()返回void。你想要的PrepareTask可能是

while (!_taskCodeQueue.empty()) {
//    ^^^ also fixed condition
    _taskQueue.push((_taskStore.find(_taskCodeQueue.front()))->second);
    _taskCodeQueue.pop();
}

一个好的经验法则是从第一条错误消息开始。

在你的情况下,这是

CertManMgmtDomainController.h:49: error: 'CertManMgmtEECertController' does not name a type

可能您有拼写错误,可能头没有包含在实现文件中,可能标识符被重新定义为函数,等等。但从这个开始。忽略其余的错误:它们很可能是第一个错误导致的。

编辑:写完上面的内容后,我在另一个答案中看到您使用的是std::queue,实际上,它的pop方法返回void。这是为了例外安全。没有将CCD_ 7和CCD_。


关于打字错误的可能性,请注意

  • Visual Studio等现代IDE提供有关标识符和的工具提示

  • C++提供命名空间,以更实用的方式处理常见前缀。

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

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