【问题标题】:Why -fpermissive is triggered in my code为什么在我的代码中触发 -fpermissive
【发布时间】:2015-10-27 05:11:50
【问题描述】:

我正在尝试构建一个非循环树结构,每个节点由一个字符串标识,每个分支节点的类型为 PrimMap。同一代的所有节点都保存为映射中的 Item 对象。以下是缩写代码:

class PrimMap {
    struct Item {  // a tagged union of different typed objects
        Item( PrimMap * pPrimMap );
        ...
    }
    PrimMap const * _pParent;  // point to fixed parent
    PrimMap( const std::string & contextName, PrimMap const * pParent );
    enum Error { ... };
    Error add( const std::string & key, Item item );
        // add an Item to a branch node
}

inline PrimMap::PrimMap( const std::string & contextName, PrimMap const * pParent ) : _pParent( pParent )
{
    if (pParent)
    {
        pParent->add( contextName, Item( this ) );
    }
}

错误信息是: ../src/PrimMap.h:314:57:错误:将 'const PrimMap' 作为 'PrimMap::Error PrimMap::add(const string&, PrimMap::Item)' 的 'this' 参数传递会丢弃限定符 [-fpermissive ] pParent->add(contextName, Item(this, fix, marker));

我看不出这个错误消息的意义——特别是,我看不出“this”是如何与构造函数中的“const PrimMap”*相关联的。

我错过了什么?

【问题讨论】:

  • 请发布更多代码(未缩写)。该错误似乎是您调用Error 成员函数的位置(通过其声明可能会修改其对象),可能在const 的对象上,但我没有看到代码的那部分。 (第 314 行是什么?)。如果您可以将您的代码精简为可以编译但仍然显示错误的代码,那将是理想的。
  • 错误是一个枚举。这不是原因。我将修改原始帖子以包含更多信息。
  • 错误信息表明pParent 指向一个常量对象。在您的代码中,它指向一个非常量对象。你确定你的“缩写”代码是准确的吗?错误消息中的 add 调用看起来与您在代码中发布的不同。
  • 你说得对。我应该使用“PrimMap * const pParent”来修复指向的指针。 "PrimMap const * pParent" 与 gcc 中的 "const PrimMap * pParent" 相同。

标签: c++ gcc g++


【解决方案1】:

为什么在我的代码中触发了-fpermissive

您正在const 对象上调用非const 成员函数。

修复

由于要修改父对象,所以删除函数参数中的const

PrimMap( const std::string & contextName, PrimMap* pParent );

相应地更改实现。

inline PrimMap::PrimMap( const std::string & contextName, PrimMap* pParent )
{
    if (pParent)
    {
        pParent->add( contextName, Item( this ) );
    }
}

【讨论】:

  • const 是在指针上,而不是在指针指向的对象上。这不应该是原因。
  • 你说得对。我应该使用“PrimMap * const pParent”来修复指向的指针。 "PrimMap const * pParent" 与 gcc 中的 "const PrimMap * pParent" 相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 2016-01-12
  • 1970-01-01
  • 2014-04-02
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多