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

似乎成员函数 distinct_at_wrt_variable 没有限定符 const 而 monomial.first 是一个 const 对象。值类型为 std::map 定义为

typedef pair<const Key, T> value_type;

即 Key 具有限定符 const。

于 2013-11-04T23:00:14.893 回答
1

value_typea 的被std::map<KeyType, MappedType>声明为 a std::pair<const KeyType, MappedType>

a 的迭代器std::map(这是你的 for 循环使用的)在地图的value_type.

在您的情况下,这会导致您所认识到monomial.first的类型const NonCommutativeMonomial<SR>不能与非常量成员函数一起使用。

值类型中的键存在的原因const是为了防止映射本身在迭代过程中被修改。

于 2013-11-04T23:11:56.403 回答