【问题标题】:C++11 - "expected unqualified-id before 'nullptr' "C ++ 11 - “预期的”Nullptr“之前的不合格ID”
【发布时间】:2017-06-02 05:29:03
【问题描述】:

我对我的代码进行了一些编辑,然后做了大约 15 次“撤消”操作以回到我上次成功编译的位置,只是没有编译它,而是出现了这个前所未有的错误:

expected unqualified-id before 'nullptr'

双击错误将我带到qcompilerdetection.h 的下面部分,这是一个我不知道存在的文件。我对代码的编辑是如何弄乱这个文件的?或者这是对真正问题的误导?我知道我已经出现了错误,因为在代码中完全不同的地方缺少括号......所以我检查了我在上次成功编译和这个编译之间编辑的每一行代码。不幸的是,我是个白痴,并在“重做”所有内容之前关闭了程序,看看是否修复了它。所以现在我不知道要更改什么来修复,而且我太菜鸟了,无法在不进一步破坏我的代码的情况下做任何事情。

/*
 * C++11 keywords and expressions
 */
#ifdef Q_COMPILER_NULLPTR
# define Q_NULLPTR         nullptr
#else
# define Q_NULLPTR         NULL
#endif

#ifdef Q_COMPILER_DEFAULT_MEMBERS
#  define Q_DECL_EQ_DEFAULT = default
#else
#  define Q_DECL_EQ_DEFAULT
#endif

#ifdef Q_COMPILER_DELETE_MEMBERS
# define Q_DECL_EQ_DELETE = delete
#else
# define Q_DECL_EQ_DELETE
#endif

具体到这一点:

# define Q_NULLPTR         nullptr
                           ^

如果有帮助的话,我正在 Raspberry Pi 3 上的 Qt5 中设置 QThread。以前从未见过这样的问题,只有我实际编写的代码中出现错误。这是我调试器派上用场的地方吗?我不知道如何在 Qt Creator 中使用它。

如果它有助于查看...这是我正在处理的代码。

press.cpp

#include <QDebug>
#include <wiringPi.h>
#include "functions.h"
#include "press.h"

#define PUMP 21
#define SOLENOID_DWN 24
#define SOLENOID_UP 25
#define LIGHT_LEFT 26
#define LIGHT_RIGHT 27
#define LASER 28
#define ENCODER_A 0
#define ENCODER_B 2
#define PEDAL_RIGHT 12
#define PEDAL_LEFT 13
#define HOME 14

Press::Press()
{

}

void Press::programRun() {
    qDebug() << "Hunting Position...";
    qDebug() << positionTarget;
    digitalWrite(PUMP,HIGH);
    digitalWrite(SOLENOID_DWN,HIGH);
    upFlag = 0;
    while (pos > positionTarget){
        if (stopFlag == 1){
            emit stop();
            qDebug() << "emit stopped";
            return;
        }
        if (pausedFlag == 1){
            if (digitalRead(PEDAL_LEFT) == LOW){
                //Functions::programUnpause();
                emit resume();
                qDebug() << "emit resumed";
                delay(100);
                while (digitalRead(PEDAL_LEFT) == LOW){}
                delay(100);
            }
        }
        if (digitalRead(PEDAL_RIGHT) == LOW){
            emit stop();
            //Functions::programStop();
            delay(100);
            while (digitalRead(PEDAL_RIGHT) == LOW){}
            delay(100);
        }
        if (digitalRead(PEDAL_LEFT) == LOW){
            //Functions::programPause();
            emit pause();
            delay(100);
            while (digitalRead(PEDAL_LEFT) == LOW){}
            delay(100);
        }
        delayMicroseconds(30);
    }
    //Functions::solenoidOff();
    //Functions::solenoidUp();
    upFlag = 1;
    //Functions::programPause();
    emit pause();
    while (digitalRead(HOME) == HIGH){
        if (stopFlag == 1){
            emit stop();
            qDebug() << "emit stopped";
            return;
        }
        if (pausedFlag == 1){
            if (digitalRead(PEDAL_LEFT) == LOW){
                //Functions::programUnpause();
                emit resume();
                qDebug() << "emit resumed";
                delay(100);
                while (digitalRead(PEDAL_LEFT) == LOW){}
                delay(100);
            }
        }
        if (digitalRead(PEDAL_RIGHT) == LOW){
            emit stop();
            //Functions::programStop();
            delay(100);
            while (digitalRead(PEDAL_RIGHT) == LOW){}
            delay(100);
        }
        if (digitalRead(PEDAL_LEFT) == LOW){
            //Functions::programPause();
            emit pause();
            qDebug() << "emit paused";
            delay(100);
            while (digitalRead(PEDAL_LEFT) == LOW){}
            delay(100);
        }
        delayMicroseconds(30);
    }
    qDebug() << "FINISHED";
    emit stop();
    Functions::solenoidOff();
}

main.cpp

#include <QCursor>
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QFile>
#include <QByteArray>
#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonArray>
#include <QFuture>
#include <QThread>
#include <QtConcurrent>
#include <QObject>
#include <wiringPi.h>
#include <pthread.h>
#include "datahandler.h"
#include "functions.h"
#include "press.h"

#define PUMP 21
#define SOLENOID_DWN 24
#define SOLENOID_UP 25
#define LIGHT_LEFT 26
#define LIGHT_RIGHT 27
#define LASER 28
#define ENCODER_A 0
#define ENCODER_B 2
#define PEDAL_RIGHT 12
#define PEDAL_LEFT 13
#define HOME 14

QScopedPointer<Functions> myFunctions(new Functions);
QScopedPointer<DataHandler> myData(new DataHandler);

QThread* thread = new QThread;
Press* pressProgram = new Press();

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    app.setOverrideCursor( QCursor( Qt::BlankCursor ) );    //Hide the cursor

    pressProgram->moveToThread(thread);
    QObject::connect(thread, SIGNAL (started()), pressProgram, SLOT (programRun()));
    QObject::connect(pressProgram, SIGNAL (stop()), thread, SLOT (quit()));
    QObject::connect(pressProgram, SIGNAL (stop()), thread, SLOT (deleteLater()));
    QObject::connect(pressProgram, SIGNAL (stop()), pressProgram, SLOT (deleteLater()));
    //thread->start();

    QQmlApplicationEngine engine;
    engine.rootContext()->setContextProperty("pressProgram",pressProgram);
    engine.rootContext()->setContextProperty("myFunctions",myFunctions.data());
    engine.rootContext()->setContextProperty("myData",myData.data());
    engine.rootContext()->setContextProperty("noteProfileArray",noteProfileArray);
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();
}

【问题讨论】:

  • 在编译某些实现 (.cpp) 文件时,通常会发生头文件中的错误。发生此错误时正在编译哪个实现文件?
  • 一旦你确定了哪个 cpp 文件报告了错误,就可以开始雕刻了。您不需要任何代码来重现错误,只需包含语句即可。注释掉最后一个 include 之后的所有内容。建造。如果错误消失,请射击。我错了。一个一个地添加每个函数,直到它不构建。现在您知道哪个函数是问题所在,开始注释掉函数的某些部分以进一步缩小问题范围。如果我是对的,请开始一一注释掉标题。缩小搜索范围。
  • 当错误发生时,不确定如何检查哪个.cpp 文件正在进行中。我将开始搜索“Qt Creator 调试”
  • @daGriggs 你可以先尝试制造minimal reproducible example。一种方法是:开始从你的项目中取出一些东西,直到它停止失败。
  • 谢谢,我尝试了一些删除,发现它使事情变得更加复杂,因为发生了损坏的#includes 或类调用的连锁事件。幸运的是,我发现了罪魁祸首并解决了这个问题。不过对于阅读本文的其他人来说,这是很好的一般调试建议。

标签: c++ qt c++11


【解决方案1】:

事实证明这属于所有情况的 99%:语法错误。

在我认为我没有编辑过的内容中发现了错误的代码行,IDE 没有单独指出,但需要修复。正如我所怀疑的,头文件错误是一个误导,我非常感谢评论:

“编译某些.cpp文件时通常会出现头文件中的错误。”

很高兴知道我的代码并没有直接破坏编译器级别的文件,而是导致许多奇怪的背景事情出错,表现为一个看似根深蒂固的问题。

旁注:我相信我犯了这个错误,因为我编辑了多个 .cpp 文件,并且一定忘记“撤消”其中一个。我希望有一种方法可以在 Qt Creator 项目中全局撤消操作。

【讨论】:

  • 考虑使用源代码管理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-05
  • 2021-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多