これらの関数は互いにオーバーロードしません。それらは同じシグネチャを持っているため、同じ関数を再定義しようとするとエラーになります。戻り値の型は、関数のシグネチャの一部ではありません。const
関数をオーバーロードするには、同じ名前でパラメーターまたは/volatile
修飾子が異なる 2 番目の関数を宣言する必要があります。つまり、戻り値の型ではなく、関数の修飾子です。
(それらは互いにオーバーライドしません。オーバーライドは、派生クラスが基本クラスの仮想関数に対して行うことです)。
メンバー関数のaconst
および非オーバーロードを定義するのが一般的です。const
オーバーロードは、戻り値の型だけでなくconst
、関数を宣言する必要があります。const
T& operator()(par_list){blablabla}
const T& operator()(par_list) const {blablabla}
^^^^^
()
これで、非const
オブジェクトに適用した場合に最初のメソッドが呼び出され、オブジェクトに適用した場合に 2 番目のメソッドが呼び出されconst
ます。例えば:
Thingy nc;
Thingy const c;
nc(); // calls the first (non-const) overload
c(); // calls the second (const) overload