非成员函数不能有cv-qualifier

时间:2012-06-11 14:58:33

标签: c++ templates const

在编写以下函数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,因此上面的代码应该编译。我想知道为什么我得到错误?

4 个答案:

答案 0 :(得分:92)

您希望不修改t的愿望在const T& t中表达。结尾const指定您不会修改类abs所属的任何成员变量。由于此函数所属的类没有,因此会出现错误

答案 1 :(得分:31)

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

由于这是一个自由函数,因此没有this,并且不需要该修饰符。

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

答案 2 :(得分:12)

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

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

答案 3 :(得分:2)

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

有一个非成员函数,它不属于该类,因此添加const对端错误发生。

解决问题的方法:要么成为类成员函数要么删除const关键字const对面