【问题标题】:Non const field fine in a function but recognised as const in another one一个函数中的非 const 字段很好,但在另一个函数中被识别为 const
【发布时间】:2020-05-23 08:24:14
【问题描述】:

我有一个非 const 字段 ctxt。 我有这样的功能:

inventory_input inventory_selector::get_input()
{
    inventory_input res;

    const input_context ip;

    res.action = ctxt.handle_input();
    res.ch = ctxt.get_raw_input().get_first_input();

    std::tuple<point, bool> tuple = ctxt.get_coordinates_inventory( w_inv );//Fine
    std::tuple<point, bool> tuple = ip.get_coordinates_inventory( w_inv );//Error

    res.entry = find_entry_by_invlet( res.ch );

    if( res.entry != nullptr && !res.entry->is_selectable() ) {
        res.entry = nullptr;
    }

    return res;
}

错误是“对象具有与成员函数不兼容的类型限定符”,因为 ip 是 const 但函数 get_coordinates_inventory 不是 const。 但是,我有另一个这样的功能:

inventory_entry *inventory_selector::find_entry_by_coordinate( point coordinate ) const
{
    input_context ip;
    std::tuple<point, bool> tuple = ctxt.get_coordinates_inventory( w_inv );//surprising, this line is having error.
    std::tuple<point, bool> tuple = ip.get_coordinates_inventory( w_inv );//this line dosn't has error
}

错误信息是: 该对象具有与成员函数“input_context_inventory”不兼容的类型限定符,对象类型为:const input_context。 我不明白为什么会发生这种情况,ctxt 和 ip 都是非常量的,它们中的一个怎么会出错而另一个没有呢?

【问题讨论】:

  • ctxt 和 ip 都是非 const 不,ip 在您的代码中声明为 const
  • 请包含get_coordinates_inventory()的定义

标签: c++


【解决方案1】:

我有一个非 const 字段 ctxt

...

函数 get_coordinates_inventory 不是 const

你的问题。请注意此方法上的 const 限定符:

inventory_entry *inventory_selector::find_entry_by_coordinate( point coordinate ) const
                                                                                  ^^^^^

这意味着可以在const inventory_selector 上调用此方法。因此,在这个函数中,隐含的this 指针指向const inventory_selector。因此,您不能在 ctxt 上调用非 const 方法——它也是 const,因为它是在方法上下文中被视为 const 的对象的成员:

  • thisconst inventory_selector *
  • 所以this-&gt;ctxtconst input_context &amp;
  • 因此不允许调用 this-&gt;ctxt.get_coordinates_inventory(),因为该方法未声明为 const。

inventory_selector::find_entry_by_coordinate 应设为非 const,或 input_context::get_coordinates_inventory 应设为 const。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 2015-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多