【发布时间】: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" 相同。