2

このコードに問題があります:

NonCommutativePolynomial<SR> differential_at_wrt_variable
  (std::map<VarId,SR> valuation, VarId variable) {

    NonCommutativePolynomial<SR> result;

    for(auto &monomial : monomials_) {
        result += monomial.first.differential_at_wrt_variable(valuation, variable)
                  * monomial.second;
    }

    return result;
}

monomials_タイプはstd::map<NonCommutativeMonomial<SR>,std::uint_fast16_t>です。

result += ...で、このコンパイラ エラーが発生しています。

エラー: 'const NonCommutativeMonomial' を 'NonCommutativeMonomial NonCommutativeMonomial::differential_at_wrt_variable(std::map&, VarId&) [with SR = LossySemiring]' の 'this' 引数として渡すと、修飾子が破棄されます [-fpermissive]

これは、メソッドがオブジェクトを変更しないことを保証しない定数オブジェクトでメソッド (関数?) を呼び出していることを意味することに気付きました。私が理解していmonomial.firstないのは、どこにもそうであると宣言していないのに、どうすれば定数になることができるかということです。私が間違っているかもしれないアイデアはありますか?

編集: 以下の回答を参照してくださいmonomial.first。その非定数コピーが必要です。クラスNonCommutativeMonomial<SR>には次のコピー コンストラクターがあります。

NonCommutativeMonomial(const NonCommutativeMonomial &m) = default;

ただし、使用してそれを呼び出すと

NonCommutativeMonomial * mono = new NonCommutativeMonomial<SR>(monomial.first);

mono後で作業しても、同じエラーが発生します。

4

3 に答える 3

4

std::map では、キーは定数オブジェクトであり、決して変更してはなりません。

編集:

次の変更を提案します。

NonCommutativePolynomial<SR> result;

for(auto &monomial : monomials_) {
    NonCommutativePolynomial<SR> tmp(monomial.first);
    result += tmp.differential_at_wrt_variable(valuation, variable)
              * monomial.second;
}
于 2013-11-04T23:01:04.330 に答える
2

monomial.first が const オブジェクトであるのに対し、メンバー関数 difference_at_wrt_variable には修飾子 const がないようです。std::map の値の型は次のように定義されます。

typedef pair<const Key, T> value_type;

つまり、キーには修飾子 const があります。

于 2013-11-04T23:00:14.893 に答える
1

aのはvalue_typeastd::map<KeyType, MappedType>として宣言されますstd::pair<const KeyType, MappedType>

a の反復子std::map( for ループが使用しているもの) は、マップのvalue_type.

あなたの場合、これは、あなたが認識しているように、非 const メンバー関数では使用できないmonomial.first型を持つことになります。const NonCommutativeMonomial<SR>

値型のキーの理由は、反復中にconstマップキー自体が変更されるのを防ぐためです。

于 2013-11-04T23:11:56.403 に答える