2017-01-27 4 views
-1

コールから呼び出さ取得する方法をオーバーロードデータ型:ファンクタに関手

ファンクタCalculateAverageを呼び出すコードの上
double average=std::for_each(values.begin(),values.end(),CalculateAverage()); 

が、「無効オペレータ()(二重のelem)」の内側から

、 "operator double()const"が呼び出されています。

ファンクタは次のように定義されています。

class CalculateAverage 
{ 
private: 
    std::size_t num; 
    double sum; 
public: 

    CalculateAverage() : num (0) , sum (0) 
    { 
    } 

    void operator() (double elem) 
    { 
     num++; 
     sum += elem; 
    } 

    operator double() const 
    { 
     return sum/num; 
    } 
}; 
+0

落ち着いてください。あなたの問題(質問)を明確に伝えるようにしてください。 – WhiZTiM

+0

[docs](http://en.cppreference.com/w/cpp/algorithm/for_each)を読もうとしましたか? – LogicStuff

+0

申し訳ありませんが、私はこの宣言 "operator double()const"がどこに呼び出され、誰がそれを呼び出すのか – commanche

答えて

0

どのようにして、二重の()constが呼ばなっていますか?

std::for_eachは、関数オブジェクトを返します。

は、通常、それは次のように行われます。

CalculateAverage average=std::for_each(values.begin(),values.end(),CalculateAverage()); 

しかし、あなたの場合にはaverageがあるため、あなたのクラスに存在する過負荷のdoubleに変換されます。

これは、変換演算子を呼び出したことにより提供されています。

0

方法とダブル()constのが呼び出さなっていますか?

std::for_eachのオーバーロードは、3番目のパラメータとして渡した戻りファンクタを使用しています。それが返されると、コンパイラはユーザ定義の変換を適用します。あなたの場合、それは暗黙的なので、キャストの必要はありません。

explicit operator double() const 

と::

あなたはそれを明示的に行うことができます、あなたは、二重に結果をキャストする必要があります

double average=static_cast<double>(std::for_each(values.begin(),values.end(),CalculateAverage())); 
関連する問題