编译器说对象是const,我看不出怎么样

时间:2013-11-04 22:52:06

标签: c++ const

我遇到了这段代码的问题:

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,我仍然会遇到同样的错误。

3 个答案:

答案 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>的键的原因是为了防止迭代期间地图被修改。