65

次の関数を記述しているとき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

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 に答える