C++ передает экземпляр класса как переменную типа float в libconfig++:: lookupValue()

У меня есть этот маленький класс, который вращается вокруг одной двойной переменной

class SensorTrainData
{
    public:
        SensorTrainData() : trainingRangeFactor(2.0f) {}
        SensorTrainData( const double & _factor ) { setFactor(_factor); }

        SensorTrainData & operator=(const double& other)
        {
             setFactor(other);
             return *this;
         }

         operator double() const
         {
             return getFactor();
         }

    private:

        void setFactor( const double & factor );
        const double & getFactor() const { return trainingRangeFactor; }

        double trainingRangeFactor; 
};

Эти пользовательские функции double() и оператор "=" перегрузки позволяют мне сделать соответственно

SensorTrainData std(3.0f);
double d = std;

double k = 4.0f;
std = k;

я использую libconfig++ и я хочу быть в состоянии передать переменную std прямо в libconfig::lookupValue("varName" , std) чтобы выбрать значение "varName", которое было прочитано из файла конфигурации (текст).

К сожалению, компилятор говорит, что я не могу передать SensorTrainData &,

src/sensor.cpp:1048:45: error: no matching function for call to ‘libconfig::Setting::lookupValue(const char [12], enalu::SensorTrainData&) const’
src/sensor.cpp:1048:45: note: candidates are:
...
....
/usr/include/libconfig.h++:255:8: note: bool libconfig::Setting::lookupValue(const char*, double&) const
/usr/include/libconfig.h++:255:8: note:   no known conversion for argument 2 from ‘enalu::SensorTrainData’ to ‘double&’

конечно я мог сделать

double foo = 0.0f;
libconfig::lookupValue("varName" , foo); //load varName from file into foo
std = foo;

Но я хочу избежать лишней типизации и строк кода и т. Д.

Есть ли способ перегрузки оператора, который я мог бы использовать для этого?

Спасибо

1 ответ

Решение

Ваша проблема в постоянстве: вы пытаетесь конвертировать std к неконстантной ссылке, пока ваш operator double является постоянным и опирается на getFactor который возвращает константную ссылку.

Следующий код работает как задумано:

class SensorTrainData
{
    public:
        SensorTrainData() : trainingRangeFactor(2.0f) {}
        SensorTrainData( const double & _factor ) { setFactor(_factor); }

        SensorTrainData & operator=(const double& other)
        {
            setFactor(other);
            return *this;
        }

        operator double&()
        {
            return getFactor();
        }

    private:

        void setFactor( const double & factor ) { trainingRangeFactor = factor; }
        double & getFactor() { return trainingRangeFactor; }

        double trainingRangeFactor; 
};

Очевидным недостатком является то, что вы сейчас выставляете trainingRangeFactor в качестве неконстантной ссылки.

Другие вопросы по тегам