2016-09-21 45 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引用。