2011-04-10 51 views
2

我有一个包含类的头文件。在这一类中,我有一个函数,像这样:奇怪的const正确性错误

class Definition 
{ 
public: 
    int GetID() 
    { 
    return Id; 
    } 

//Other methods/variables 
private: 
    int Id; 

} 

当我attemped得到那个ID为这样:

for (std::map<Definition, std::vector<bool> >::iterator mapit = DefUseMap.begin(); mapit != DefUseMap.end(); ++mapit, defIndex++) 
{ 
    stream << "Definition " << (*mapit).first.GetID() << " Def Use" << endl << "\t"; 
} 

我收到以下错误

CFG.cc:1145:错误:将'const Definition'作为'int'的参数'int Definition :: GetID()'丢弃限定符

是因为我在地图内部使用定义,而且我不允许调用方法那映射def从头?有没有办法让这个ID变出来?

预先感谢

回答

9

声明getID()方法常量:

int getId() const 
{ 
    return Id; 
} 

然后,该方法可以通过const引用,这是什么operator<<()被传递被调用。

+4

的一般规则是声明的方法'const'如果只需要' const'访问对象,即'this'可以是一个'const'指针,事情就会正常工作。还要注意'mutable'关键字,它表示可以在'const'方法中更改类成员。 “可变”成员的一个例子是,如果你想记录一个对象的最后访问时间。在这种情况下,访问时间戳将是一个“可变”成员,因此可以从“const”getter方法更新。 – 2011-04-10 03:06:18

+0

user127817 - 如果您发现我的答案令人满意,请考虑接受它。谢谢! – QuantumMechanic 2011-04-10 17:56:21

1

map<Key, Value>将您的数据内部存储在std::pair<const Key, Value>中。这样就很难意外地改变密钥并破坏元素的排序。

为了能够调用的getId()为常量键,功能就必须声明为const还有:

int GetID() const;