2016-09-21 129 views
0

我有此小的类,围绕单个双可变C++传递的类实例如浮点变量在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++,我希望能够直接传递变量stdlibconfig::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转换为非const引用,而你的operator double是常量,并依靠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作为非const引用。