65

在编写以下函数abs时,我收到错误:

非成员函数unsigned int abs(const T&)不能有 cv 限定符。

template<typename T>
inline unsigned int abs(const T& t) const
{
    return t>0?t:-t;
}

删除const函数的限定符后没有错误。由于我没有t在函数内部进行修改,因此上面的代码应该已经编译。我想知道为什么我得到了错误?

4

4 回答 4

127

您不想修改t的愿望以const T& t. 结尾const指定您不会修改该类abs所属的任何成员变量。

由于没有此函数所属的类,因此您会收到错误消息。

于 2012-06-11T15:03:29.670 回答
37

const函数声明末尾的修饰符适用于成员this函数的隐藏参数。

由于这是一个免费功能,因此没有this并且不需要该修饰符。

t参数在参数列表中已有自己const的参数。

于 2012-06-11T15:01:48.693 回答
15

成员函数上的 cv 限定符指定this指针具有间接类型const(或volatile, const volatile),因此可以在具有该限定的实例上调用成员函数。

自由函数(和类静态函数)没有this指针。

于 2012-06-11T15:01:50.757 回答
3

众所周知,const参数列表后面的关键字表示这是一个指向指针常量的指针。

有一个非成员函数,它不属于该类,所以添加 const 对端错误。

解决问题:要么成为类成员函数,要么去掉const关键字const对端

于 2015-12-11T01:41:28.483 回答