解决:error C2276:“&”: 绑定成员函数表达式上的非法操作

本文介绍了在使用VS2013时遇到ERROR C2276的问题及解决方法。错误指向了一个BOOL类型变量,由于变量名与函数名冲突导致编译失败。通过修改其中一个名字解决了冲突,成功通过编译。

在VS2013中,遇到了ERROR C2276的报错,报错指向了一个BOOL类型的变量,因为其是用表示状态的作用,需要将该变量声明在类的外部,充当全局变量的作用。选中报错的变量,摁F12寻找其定义,发现指向了两个地方,一个是BOOL类型的变量,另一个是相同名字的函数找到了问题的,所在改变其中两个中的任意一个的名字,再次编译,顺利通过。

以上

严重性 代码 说明 项目 文件 行 错误 C2027 使用了未定义类型“CheckWorker” iSynthesizeDecision E:\code\ShipSea\branches\product\Ribbon\iSynthesizeDecision\iMainWnd.cpp 158 错误(活动) 应输入文件名 iSynthesizeDecision d:\IDE\Qt\Qt5.9.8\5.9.8\msvc2015\include\QtCore\qdeadlinetimer.h 54 错误(活动) 应输入文件名 iSynthesizeDecision d:\IDE\Qt\Qt5.9.8\5.9.8\msvc2015\include\QtCore\qdeadlinetimer.h 123 错误(活动) 应输入文件名 iSynthesizeDecision d:\IDE\Qt\Qt5.9.8\5.9.8\msvc2015\include\QtCore\qmutex.h 47 错误(活动) 应输入文件名 iSynthesizeDecision d:\IDE\Qt\Qt5.9.8\5.9.8\msvc2015\include\QtCore\qmutex.h 136 错误(活动) 应输入文件名 iSynthesizeDecision d:\IDE\Qt\Qt5.9.8\5.9.8\msvc2015\include\QtCore\qmutex.h 163 错误(活动) 应输入文件名 iSynthesizeDecision d:\IDE\Qt\Qt5.9.8\5.9.8\msvc2015\include\QtCore\qobject.h 58 错误(活动) 应输入文件名 iSynthesizeDecision d:\IDE\Qt\Qt5.9.8\5.9.8\msvc2015\include\QtCore\qobject.h 158 错误(活动) 应输入文件名 iSynthesizeDecision d:\IDE\Qt\Qt5.9.8\5.9.8\msvc2015\include\QtCore\qtimer.h 50 错误(活动) 应输入文件名 iSynthesizeDecision d:\IDE\Qt\Qt5.9.8\5.9.8\msvc2015\include\QtCore\qtimer.h 167 错误(活动) 应输入文件名 iSynthesizeDecision d:\IDE\Qt\Qt5.9.8\5.9.8\msvc2015\include\QtCore\qtimer.h 219 错误 C2514 “CheckWorker”: 类没有构造函数 iSynthesizeDecision E:\code\ShipSea\branches\product\Ribbon\iSynthesizeDecision\iMainWnd.cpp 153 错误 C2027 使用了未定义类型“CheckWorker” iSynthesizeDecision E:\code\ShipSea\branches\product\Ribbon\iSynthesizeDecision\iMainWnd.cpp 155 错误 C2227 “->moveToThread”的左边必须指向类/结构/联合/泛型类型 iSynthesizeDecision E:\code\ShipSea\branches\product\Ribbon\iSynthesizeDecision\iMainWnd.cpp 155 错误 C2027 使用了未定义类型“CheckWorker” iSynthesizeDecision E:\code\ShipSea\branches\product\Ribbon\iSynthesizeDecision\iMainWnd.cpp 157 错误 C2065 “doCheck”: 未声明的标识符 iSynthesizeDecision E:\code\ShipSea\branches\product\Ribbon\iSynthesizeDecision\iMainWnd.cpp 157 错误 C2065 “finished”: 未声明的标识符 iSynthesizeDecision E:\code\ShipSea\branches\product\Ribbon\iSynthesizeDecision\iMainWnd.cpp 158 错误 C2027 使用了未定义类型“CheckWorker” iSynthesizeDecision E:\code\ShipSea\branches\product\Ribbon\iSynthesizeDecision\iMainWnd.cpp 159 错误 C2065 “finished”: 未声明的标识符 iSynthesizeDecision E:\code\ShipSea\branches\product\Ribbon\iSynthesizeDecision\iMainWnd.cpp 159 错误 C2276 “&”: 绑定成员函数表达式上的非法操作 iSynthesizeDecision E:\code\ShipSea\branches\product\Ribbon\iSynthesizeDecision\iMainWnd.cpp 159 错误 C2027 使用了未定义类型“CheckWorker” iSynthesizeDecision E:\code\ShipSea\branches\product\Ribbon\iSynthesizeDecision\iMainWnd.cpp 162 错误 C2065 “progressChanged”: 未声明的标识符 iSynthesizeDecision E:\code\ShipSea\branches\product\Ribbon\iSynthesizeDecision\iMainWnd.cpp 162 错误 C2027 使用了未定义类型“CheckWorker” iSynthesizeDecision E:\code\ShipSea\branches\product\Ribbon\iSynthesizeDecision\iMainWnd.cpp 167 错误 C2065 “ruleCheckFinished”: 未声明的标识符 iSynthesizeDecision E:\code\ShipSea\branches\product\Ribbon\iSynthesizeDecision\iMainWnd.cpp 167 错误 C2664 “void analysisResWid::addRes(QList<iResult *>)”: 无法将参数 1 从“QList<QStandardItem *>”转换为“iResult *” iSynthesizeDecision E:\code\ShipSea\branches\product\Ribbon\iSynthesizeDecision\iMainWnd.cpp 168 错误(活动) 没有与参数列表匹配的 重载函数 "analysisResWid::addRes" 实例 iSynthesizeDecision e:\code\ShipSea\branches\product\Ribbon\iSynthesizeDecision\iMainWnd.cpp 168 错误 C2027 使用了未定义类型“CheckWorker” iSynthesizeDecision E:\code\ShipSea\branches\product\Ribbon\iSynthesizeDecision\iMainWnd.cpp 171 错误 C2065 “modelCheckFinished”: 未声明的标识符 iSynthesizeDecision E:\code\ShipSea\branches\product\Ribbon\iSynthesizeDecision\iMainWnd.cpp 171 错误 C2027 使用了未定义类型“CheckWorker” iSynthesizeDecision E:\code\ShipSea\branches\product\Ribbon\iSynthesizeDecision\iMainWnd.cpp 176 错误 C2065 “algorithmCheckFinished”: 未声明的标识符 iSynthesizeDecision E:\code\ShipSea\branches\product\Ribbon\iSynthesizeDecision\iMainWnd.cpp 176 错误 C2027 使用了未定义类型“CheckWorker” iSynthesizeDecision E:\code\ShipSea\branches\product\Ribbon\iSynthesizeDecision\iMainWnd.cpp 217 错误 C2227 “->setRuleList”的左边必须指向类/结构/联合/泛型类型 iSynthesizeDecision E:\code\ShipSea\branches\product\Ribbon\iSynthesizeDecision\iMainWnd.cpp 217 错误 C2027 使用了未定义类型“CheckWorker” iSynthesizeDecision E:\code\ShipSea\branches\product\Ribbon\iSynthesizeDecision\iMainWnd.cpp 218 错误 C2227 “->setModelList”的左边必须指向类/结构/联合/泛型类型 iSynthesizeDecision E:\code\ShipSea\branches\product\Ribbon\iSynthesizeDecision\iMainWnd.cpp 218 错误 C2027 使用了未定义类型“CheckWorker” iSynthesizeDecision E:\code\ShipSea\branches\product\Ribbon\iSynthesizeDecision\iMainWnd.cpp 219 错误 C2227 “->setAlgorithmList”的左边必须指向类/结构/联合/泛型类型 iSynthesizeDecision E:\code\ShipSea\branches\product\Ribbon\iSynthesizeDecision\iMainWnd.cpp 219 错误 C2027 使用了未定义类型“CheckWorker” iSynthesizeDecision E:\code\ShipSea\branches\product\Ribbon\iSynthesizeDecision\iMainWnd.cpp 220 错误 C2227 “->setData”的左边必须指向类/结构/联合/泛型类型 iSynthesizeDecision E:\code\ShipSea\branches\product\Ribbon\iSynthesizeDecision\iMainWnd.cpp 220
最新发布
07-29
你遇到的这些 **编译错误**,核心问题是: > **未定义类型 `CheckWorker`** 这是因为在 `.h` 文件中你只进行了 **前向声明**: ```cpp class CheckWorker; ``` 但你在 `.cpp` 文件中 **直接使用了 `CheckWorker` 的成员函数和信号槽连接**,而编译器并不知道这个类的完整定义,因此报错。 --- ## ✅ 解决方案 你需要 **将 `CheckWorker` 类的定义放在 `.cpp` 文件顶部**,在你使用它之前定义完整类,而不是只前向声明。 --- ## ✅ 修改步骤 ### ✅ 1. 在 `iMainWnd.cpp` 文件顶部定义 `CheckWorker` 类 将以下代码 **放在 `iMainWnd.cpp` 文件最顶部**(包含头文件之后): ```cpp #include "iMainWnd.h" #include <QThread> #include <QDebug> #include <QElapsedTimer> #include <QMessageBox> #include <QStandardItem> #include "iRule.h" #include "iModel.h" #include "iFunction.h" #include "cdtXlsx.h" #include "analysisResWid.h" // 定义 CheckWorker 类 class CheckWorker : public QObject { Q_OBJECT public: explicit CheckWorker(QObject *parent = nullptr) : QObject(parent) {} void setRuleList(QList<iRule*> rules) { m_pRules = rules; } void setModelList(QList<iModel*> models) { m_pModels = models; } void setAlgorithmList(QList<iFunction*> algorithms) { m_pAlgorithms = algorithms; } void setData(cdtXlsx* data) { m_pAllData = data; } signals: void progressChanged(int value, const QString& info); void ruleCheckFinished(QList<QStandardItem*> caseRes); void modelCheckFinished(cdtXlsx* res, cdtXlsx* labels); void algorithmCheckFinished(QString result); void finished(); public slots: void doCheck() { QElapsedTimer* m_runClock = new QElapsedTimer; QElapsedTimer* m_totalRunClock = new QElapsedTimer; if (nullptr == m_pAllData || m_pAllData->isEmpty()) { emit progressChanged(0, "校核文件不存在!"); return; } m_totalRunClock->start(); // 检查规则 m_runClock->start(); emit progressChanged(1, "正在检查规则..."); checkRuleData(); emit progressChanged(33, "规则检查完成"); // 检查模型 checkModelData(); emit progressChanged(66, "模型检查完成"); // 检查算法 checkAlgorithmData(); emit progressChanged(100, "算法检查完成"); emit finished(); } private: QList<iRule*> m_pRules; QList<iModel*> m_pModels; QList<iFunction*> m_pAlgorithms; cdtXlsx* m_pAllData; void checkRuleData() { QList<QStandardItem*> caseRes; if (nullptr == m_pAllData || m_pAllData->isEmpty()) { emit progressChanged(0, "校核文件不存在!"); return; } cdtXlsx* m_data = m_pAllData; foreach(iRule* one, m_pRules) { for (int ci = 0; ci < m_data->getSheetNum(); ci++) { cdtData alldata = m_data->getCdtdata(ci); QStringList header = alldata.getHeader(); for (int i = 0; i < alldata.rownum(); i++) { QStringList m_ruleInput; QStringList ruleHeader = one->ParserExp(); for (int j = 0; j < ruleHeader.count(); j++) { int idx = header.indexOf(ruleHeader[j]); if (idx != -1) m_ruleInput << alldata.at(i, idx); } one->setInputValue(m_ruleInput.join(",")); if (one->calculateExpression()) { if (one->getCalcuRes() > one->getThreshold()) { QStandardItem* oneRes = new QStandardItem; oneRes->setText("error: val overcome the threshold!"); caseRes << oneRes; } } } } } emit ruleCheckFinished(caseRes); } void checkModelData() { if (nullptr == m_pAllData || m_pAllData->isEmpty()) { emit progressChanged(0, "校核文件不存在!"); return; } foreach(iModel* model, m_pModels) { // 模拟模型运行 cdtXlsx* res = new cdtXlsx; cdtXlsx* labels = new cdtXlsx; emit modelCheckFinished(res, labels); } } void checkAlgorithmData() { if (nullptr == m_pAllData || m_pAllData->isEmpty()) { emit progressChanged(0, "校核文件不存在!"); return; } foreach(iFunction* algo, m_pAlgorithms) { emit algorithmCheckFinished("算法结果:" + algo->getSymbol()); } } }; ``` --- ### ✅ 2. 在 `iMainWnd.h` 中删除 `class CheckWorker;` 前向声明 如果你之前在 `.h` 文件中写了: ```cpp class CheckWorker; ``` 请 **删除它**,因为我们已经在 `.cpp` 中完整定义了这个类。 --- ### ✅ 3. 在 `iMainWnd` 构造函数中初始化线程和工作对象 确保你已经添加了如下代码: ```cpp m_checkThread = new QThread(this); m_checkWorker = new CheckWorker(); m_checkWorker->moveToThread(m_checkThread); connect(m_checkThread, &QThread::started, m_checkWorker, &CheckWorker::doCheck); connect(m_checkWorker, &CheckWorker::finished, m_checkThread, &QThread::quit); connect(m_checkWorker, &CheckWorker::finished, m_checkWorker, &CheckWorker::deleteLater); connect(m_checkThread, &QThread::finished, m_checkThread, &QThread::deleteLater); connect(m_checkWorker, &CheckWorker::progressChanged, this, [=](int value, const QString& info) { m_pProgress->setValue(value); m_pProgressInfo->setText(info); }); connect(m_checkWorker, &CheckWorker::ruleCheckFinished, this, [=](QList<QStandardItem*> res) { m_pResWid->addRes(res); }); connect(m_checkWorker, &CheckWorker::modelCheckFinished, this, [=](cdtXlsx* res, cdtXlsx* labels) { m_pRefineData = res; m_pModelLabel = labels; }); connect(m_checkWorker, &CheckWorker::algorithmCheckFinished, this, [=](const QString& result) { qDebug() << "算法结果:" << result; }); ``` --- ### ✅ 4. 替换原始 `checkData()` 函数 ```cpp void iMainWnd::checkData() { if (!isReadyRun) { qInfo() << QStringLiteral("方案还未设置成功,暂勿操作。"); return; } m_checkWorker->setRuleList(m_pRules); m_checkWorker->setModelList(m_pModels); m_checkWorker->setAlgorithmList(m_pAlgorithms); m_checkWorker->setData(m_pAllData); m_checkThread->start(); } ``` --- ## ✅ 修复 `addRes` 类型不匹配错误 你当前的错误是: ``` 无法将参数 1 从“QList<QStandardItem *>”转换为“iResult *” ``` 这是因为你 `m_pResWid->addRes()` 接收的是 `QList<iResult*>`,但你传入的是 `QList<QStandardItem*>`。 ### 修复方法: ```cpp connect(m_checkWorker, &CheckWorker::ruleCheckFinished, this, [=](QList<QStandardItem*> res) { QList<iResult*> converted; foreach (QStandardItem* item, res) { iResult* r = new iResult; r->setInfo(item->text()); converted << r; } m_pResWid->addRes(converted); }); ``` --- ## ✅ 总结 | 问题 | 解决方式 | |------|----------| | `CheckWorker` 未定义 | 在 `.cpp` 中完整定义该类 | | `moveToThread` 错误 | 确保类定义完整 | | 信号连接错误 | 确保类定义中有 `Q_OBJECT` 和完整信号 | | `addRes` 类型不匹配 | 做类型转换 | --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值