0

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

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;

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

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

谢谢

4

1 回答 1

1

你的问题是关于 const-ness:你试图转换std为非常量引用,而你operator double是 const 并且依赖于getFactor它返回一个 const 引用。

以下代码按预期工作:

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为非常量引用。

于 2016-09-22T12:12:45.070 回答