問題は、からオブジェクトの非const関数test2.test()を呼び出すことです。consttest2testing::test1
testing::test1test2パラメータとして取得しますconst testing &test2。だからtesting::test1、内test2const。次に、関数の最初の行で:
test2.test()
testing::test関数は で呼び出されますtest2。その関数はconst署名の最後で宣言されていないため、呼び出されたオブジェクト (this暗黙的に渡されたポインター) を変更する可能性があります。そこで呼び出せるようにすることで、コンパイラはconst明示的なキャストなしで変数を変更できるようになりますが、これは C++ では許可されていません。 したがって、エラーメッセージを説明するには:
test.cpp:15: error: passing ‘const testing’ as ‘this’ argument of ‘int testing::test()’ discards qualifiers
thisは、メンバー関数 ( testing::test) が動作するオブジェクトを参照します。この場合、 は で宣言されていないconstため、オブジェクト ( ) を参照する非ポインター ( )を作成しようとすると不一致が検出され、無視されます。修飾子. _testing::testconstconstthisconsttestingconst
これを解決するには、関数が呼び出されたオブジェクトを変更する必要があるかどうかを判断しtesting::testます (現在の記述方法では変更されませんが、return 1変更される可能性があるため、意図されていることを考える必要があります)。機能は)です。必要な場合、オブジェクトでそれを呼び出すのは明らかにconst悪いですが、コンパイラにそれをオーバーライドするように依頼することはできますconst_castが、これは危険です。そうでない場合は、オブジェクトでも呼び出せるconstようにマークします。const
class testing{
int test1() const;
// ...
}
int testing::test() const {
// ...
}