Значение ошибки lvalue требуется как унарный операнд '&'

У меня проблема при создании потока в объекте. Ошибка: lvalue требуется как унарный операнд '&'

Файл CPP

#include "AirQ.h"


static int i=0;


AirQ::AirQ(int pinNo, bool input):Sensor("AIRQUALITY", "PPM",pinNo,input) {
    threadShouldRunAQ = true;
    this->bufferLength = 256;

        signal(SIGINT, AirQ::signalHandler);
        airQualitySensor = new upm::Ublox6(pinNo);

        if (!airQualitySensor->setupTty(B9600))
            std::cerr << "[ERROR][GPS] Failed to setup tty port parameters!" << std::endl;

        try
        {
            std::thread air = std::thread(&AirQ::processDataAQ(), this);
        }
        catch (std::exception e)
        {
            std::cerr << "[ERROR][GPS] " << e.what() << std::endl;
        }
}

AirQ::~AirQ() {
    // TODO Auto-generated destructor stub
}


void AirQ::signalHandler(int sigNo)
{
    if (sigNo == SIGINT)
        threadShouldRunAQ = false;

}

void AirQ::processDataAQ()
{

    while (threadShouldRunAQ)
    {
        i++;
        if (airQualitySensor != NULL)
            if (airQualitySensor->dataAvailable())
            {
                //TODO
            }


            usleep(100000);
    }
}

void AirQ::getData(std::string value)
{
    this->readBuffer = value;
}

std::string AirQ::logData()
{
    AirQ::setCollectedFlag(false);
    return this->readBuffer;
}

void AirQ::setCollectedFlag(bool flag)
{
    this->collectedFlag = flag;
}

H-файл

#include <ublox6.h>
#include "Sensor.h"

#ifndef AIRQ_H_
#define AIRQ_H_

static bool threadShouldRunAQ;
static upm::Ublox6* airQualitySensor;



class AirQ: private Sensor {
private:
    std::string readBuffer;
    bool collectedFlag;
    size_t bufferLength;
    static void signalHandler(int);
    void processDataAQ();

protected:


public:
    AirQ(int, bool);
    virtual ~AirQ();

    std::string logData();
    void getData(std::string);
    void setCollectedFlag(bool);
    std::thread processingThread;
};


#endif /* AIRQ_H_ */

Об ошибке сообщается в файле CPP, строка std::thread air = std::thread(&AirQ::processDataAQ(), this); и я не понимаю, что не так.

В основном я создаю объект следующим образом.

AirQ* test = new AirQ(0,true);

Любая помощь будет оценена.

Решение. Замените &AirQ::processDataAQ() на &AirQ::processDataAQ. Последний является указателем на функцию-член. – Пит Беккер


person Iosif Bancioiu    schedule 23.04.2016    source источник
comment
@bkVnet Да, но именно поэтому он отправляется как ссылка &   -  person Iosif Bancioiu    schedule 23.04.2016
comment
Измените &AirQ::processDataAQ() на &AirQ::processDataAQ. Последний является указателем на функцию-член.   -  person Pete Becker    schedule 23.04.2016
comment
Это работает @PeteBecker, пожалуйста, опубликуйте это как решение, чтобы принять его :)   -  person Iosif Bancioiu    schedule 23.04.2016
comment
Вздох @ отвечает в комментариях.   -  person Lightness Races in Orbit    schedule 23.04.2016
comment
// TODO Автоматически сгенерированный деструктор-заглушка - заглушка будет использоваться как dtor, если она присутствует. dtor по умолчанию будет предоставлен компилятором, если нет «заглушки» И вы не запретите, используя ~AirQ() = delete; Если вы запрещаете, то вы должны предоставить dtor.   -  person 2785528    schedule 23.04.2016
comment
@DOUGLASO.MOEN я буду писать код внутри. Это была просто часть кода :)   -  person Iosif Bancioiu    schedule 24.04.2016


Ответы (1)


std::thread air = std::thread(&AirQ::processDataAQ(), this);
//                                                ^^

Скобки вызывают функцию. Вы не хотите вызывать функцию; вы хотите только назвать его.

Снимите скобки.


Я бы также предложил избавиться от инициализации копирования.

Итак, просто:

std::thread air(&AirQ::processDataAQ, this);
person Lightness Races in Orbit    schedule 23.04.2016