2016-09-21 7 views
0

私は、これらのユーザー機能double()と演算子「=」過負荷に私を許可するシングル、ダブル変数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; 
}; 

を中心に展開し、この小さなクラスを持っています私はlibconfig++を使用していますそれぞれ

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

double k = 4.0f; 
std = k; 

を行うと、私は設定(テキストから読み取った値「VARNAMEを」、選ぶためにlibconfig::lookupValue("varName" , std)に直接変数stdを渡すことができるようにしたいです)ファイル。

残念ながら、コンパイラはSensorTrainData &を渡すことはできないと言います。

私は

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

を行うことができ、もちろんの

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&’ 

しかし、私は余分なタイピングとコード行を避けたいなど

私はそれを行うために使用できる演算子オーバーロードのトリックはありますか?

答えて

1

あなたの問題は、constのネスについてですありがとう:あなたはあなたのoperator doubleでのconstで、const参照を返すgetFactorに依存している間、非const参照にstdを変換しようとしています。

次のコードでは、意図したとおりに動作します:

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; 
}; 

明らかな欠点は、あなたが今、非const参照としてtrainingRangeFactorを露出していることです。

関連する問題