2012-06-11 27 views
40

在寫下面的函數abs,我得到的錯誤:非成員函數不能具有CV-預選賽

非成員函數unsigned int abs(const T&)不能有CV-預選賽。

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

刪除該函數的const限定符後沒有錯誤。由於我不修改t裏面的函數,上面的代碼應該已經編譯好了。我想知道爲什麼我得到了錯誤?

回答

84

您不想修改t的意願表示爲const T& t。結尾const指定您將不會修改abs類所屬的任何成員變量。由於沒有這個函數所屬的類,所以你得到一個錯誤

30

函數聲明結尾處的const修飾符適用於成員函數的隱藏this參數。

由於這是一項免費功能,因此不存在this,並且不需要該修飾符。

t參數在參數列表中已有其自己的const

12

上的成員函數的CV-限定符指定的this指針是已經進行間接尋址類型const(或volatileconst volatile),並且因此該成員函數可以在與該資格實例調用。

自由函數(和類靜態函數)沒有this指針。

1

衆所周知,const關鍵字緊跟在參數列表之後,表示這是一個指針常量的指針。

有一個非成員函數,它不屬於該類,所以添加const對端錯誤發生。

用於解決該問題:是要麼成爲一個類的成員函數或刪除關鍵字const const的相對端

相關問題