このコードに問題があります:
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
後で作業しても、同じエラーが発生します。