【问题标题】:c++ passing class instance as float variable in libconfig++ :: lookupValue()c++ 在 libconfig++ ::lookupValue() 中将类实例作为浮点变量传递
【发布时间】:2017-01-30 08:41:59
【问题描述】:

我有一个围绕单个双变量的小类

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++,我希望能够直接在libconfig::lookupValue("varName" , std) 中传递变量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;

但我想避免额外的打字和代码行等。

是否有我可以使用的运算符重载技巧来做到这一点?

谢谢

【问题讨论】:

    标签: c++ c++11 operator-overloading libconfig


    【解决方案1】:

    您的问题是关于 const 的:您试图将 std 转换为非 const 引用,而您的 operator double 是 const 并依赖于返回 const 引用的 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 公开为非常量引用。

    【讨论】:

      猜你喜欢
      • 2013-06-23
      • 1970-01-01
      • 2022-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-15
      • 1970-01-01
      相关资源
      最近更新 更多