我遇到了这段代码的问题:
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'传递为'this' 'NonCommutativeMonomial的论证 NonCommutativeMonomial :: differential_at_wrt_variable(std :: map&amp;,VarId&amp;)[with SR = LossySemiring]'丢弃限定符 [-fpermissive]
现在我意识到这意味着我在一个常量对象上调用一个方法(函数?),该方法不保证它不会修改对象。我不明白的是monomial.first
当我没有在任何地方宣布它时,它是如何保持不变的。我可能做错了什么想法?
编辑:
请参阅下面的答案,为什么monomial.first
是不变的。我需要一个非常量的副本,类NonCommutativeMonomial<SR>
有这个拷贝构造函数:
NonCommutativeMonomial(const NonCommutativeMonomial &m) = default;
然而,当我使用
调用它时NonCommutativeMonomial * mono = new NonCommutativeMonomial<SR>(monomial.first);
之后使用mono
,我仍然会遇到同样的错误。
答案 0 :(得分: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;
}
答案 1 :(得分:2)
似乎成员函数differential_at_wrt_variable没有限定符const,而monomial.first是const对象。 值类型是为std :: map定义的
typedef pair<const Key, T> value_type;
Key是限定词const。
答案 2 :(得分:1)
value_type
的{{1}}被声明为std::map<KeyType, MappedType>
。
std::pair<const KeyType, MappedType>
的迭代器(这是你的循环使用的)是在地图的std::map
上。
在您的情况下,这会导致value_type
具有monomial.first
类型,如您所知,它不能与非const成员函数一起使用。
值类型为const NonCommutativeMonomial<SR>
的键的原因是为了防止迭代期间地图键被修改。