在编写以下函数abs
时,我收到错误:
非成员函数unsigned int abs(const T&)
不能拥有cv-qualifier。
template<typename T>
inline unsigned int abs(const T& t) const
{
return t>0?t:-t;
}
删除函数的const
限定符后,没有错误。由于我没有在函数内部修改t
,因此上面的代码应该编译。我想知道为什么我得到错误?
答案 0 :(得分:92)
您希望不修改t
的愿望在const T& t
中表达。结尾const
指定您不会修改类abs
所属的任何成员变量。由于此函数所属的类没有,因此会出现错误
答案 1 :(得分:31)
函数声明末尾的const
修饰符适用于成员函数的隐藏this
参数。
由于这是一个自由函数,因此没有this
,并且不需要该修饰符。
t
参数在参数列表中已有自己的const
。
答案 2 :(得分:12)
成员函数上的cv限定符指定this
指针具有间接类型const
(或volatile
,const volatile
),因此成员函数可以在具有该资格的实例上调用。
自由函数(和类静态函数)没有this
指针。
答案 3 :(得分:2)
众所周知,参数列表后面跟着const
关键字表示这是一个指向指针常量的指针。
有一个非成员函数,它不属于该类,因此添加const对端错误发生。
解决问题的方法:要么成为类成员函数要么删除const
关键字const对面