将“const”作为“this”参数传递时出错

Posted

技术标签:

【中文标题】将“const”作为“this”参数传递时出错【英文标题】:error passing 'const' as 'this' argument 【发布时间】:2014-01-15 21:41:06 【问题描述】:

我一直被困在一个错误上,以下,我正在学习,我想我不明白这个错误。

 droid.cpp: In function ‘std::ostream& operator<<(std::ostream&, const Droid&)’: 

droid.cpp:94:30: error: passing ‘const Droid’ as ‘this’ argument of ‘std::string 

Droid::getId()’ discards qualifiers
 [-fpermissive]

第 94 行:

std::ostream&   operator<<(std::ostream &os, Droid const & a)
    os << "Droid '" << a.getId() << "', " << *a.getStatus() << ", " << a.getEnergy() << std::endl;

和听众:

std::string   getId();

对于“operator

有人能解释一下编译器在说什么吗?

【问题讨论】:

【参考方案1】:

您需要将该方法设置为const,以便可以在const 实例上或通过const 引用调用它:

std::string   getId() const;
                      ^^^^^

这同样适用于在std::ostream&amp; operator&lt;&lt;(std::ostream &amp;os, Droid const &amp; a) 中调用的所有Droid 方法。

您还需要在方法的定义中添加const

【讨论】:

@juanchopanza 你介意提一下它是怎么称呼的吗?我想了解为什么我需要在引用时明确声明 const【参考方案2】:

您需要std::string getId() const;。否则,编译器会认为getId() 可能会更改实例,而您不能在const Droid&amp; 上执行此操作。 getStatus()getEnergy() 也一样。

【讨论】:

以上是关于将“const”作为“this”参数传递时出错的主要内容,如果未能解决你的问题,请参考以下文章

C++ Boost - 序列化错误 - 将“const B”作为“this”参数传递会丢弃限定符

错误:将“const SunscreenSPF”作为“this”参数传递会丢弃限定符问题

C++ 错误 - 将 'const Dataset<double>' 作为 'this' 参数传递会丢弃限定符 [-fpermissive]

std::remove_if 将“const type”作为“this”参数传递会丢弃 linux 上的限定符 [重复]

将“const std::map<int, bool>”作为“this”参数传递会丢弃 lambda 函数中的限定符 [-fpermissive]

将对象实例直接作为 const 接口参数传递时,编译器是不是应该提示/警告?