2

セット内の要素の合計を見つけようとしていますが、それを見つける良い方法は何だろうと思っていました。Customer という名前のクラスと Item という名前の 2 つのクラスを作成しました。タイプ Item から std::set にリストされている製品に対して顧客が支払う必要がある合計支払いを計算する関数を作成したいと考えています。これが私のセットの宣言です:

set<Item> _items;

クラスアイテム:

private:
    string _name;
    string _serialNumber; //consists of 5 numbers
    int _count=0; //default is 1, can never be less than 1!
    double _unitPrice; //always bigger than 0!

アイテムの価格を要約するクラス Item の関数:

double Item :: totalPrice() const
{
    return _count*_unitPrice;
} 

すべての要素を合計する、私が書こうとしている関数は次のとおりです。

#include <numeric>
#include "Customer.h"
double Customer::totalSum() const
{
    double sum = std::accumulate(_items.begin(), _items.end(), 0.0);
    return sum;
}

しかし、私はこのエラーが発生します:error C2893: Failed to specialize function template 'unknown-type std::plus<void>::operator ()(_Ty1 &&,_Ty2 &&) const'

重要な注意: クラス Customer には既に Item のヘッダーが含まれています。

編集: クラス アイテムに関する情報を追加しました。

4

5 に答える 5

0

Itemの呼び出し中に、タイプの 2 つのオブジェクトを一緒に追加する方法をコンパイラが認識していないために発生するエラーですstd::accumulate

最も簡単な解決策は、既定の関数オブジェクトstd::accumulateの代わりに使用するラムダ ファンクターを指定する 4 番目のパラメーターを取るのオーバーロードを使用することです。std::plus<T>

double Customer::totalSum() const {
    return std::accumulate(_items.begin(), _items.end(), 0.0,
        [] (double previousValue, const auto& item) { // Called for every element.
            return previousValue + item.totalPrice();
        });
}

別の解決策は、2 つのオブジェクトoperator+を追加できるカスタム オーバーロードを作成することです。Item

double operator+(const Item& lhs, const Item& rhs) {
    return lhs.totalPrice() + rhs.totalPrice();
}

Itemただし、クラスには数値である複数のメンバーがあり、加算がどのように行われるかが明確でないため、これは少し混乱する可能性があります。算術演算子をオーバーロードするときは、細心の注意を払ってください。

于 2016-01-16T20:19:45.403 に答える
0

単純なループの使用を考えたのは私だけですか?

auto sum = 0.0;
for (const auto& item : items){
   sum += item.m_price;
}

それよりも簡単に質問できますか?

于 2016-01-16T20:21:45.653 に答える
0

このエラーは通常、コンパイラが型を蓄積する方法を認識していない場合に発生します。つまり、型を追加する方法を知っている必要がありますItem。したがって、クラス +で演算子をオーバーロードする必要があります。または、4 番目の引数を指定する必要がありますItem
binary_op

于 2016-01-16T20:02:07.740 に答える