43

特定のコードで問題が発生しています。誰かがこの問題について教えてくれれば幸いです。次のサンプルで問題を切り分けました。

#include <iostream>

using namespace std;

class testing{
   int test();
   int test1(const testing& test2);
};

int testing::test(){
   return 1;
}

int testing::test1(const testing& test2){
   test2.test();
   return 1;
}

したがって、次のエラーが発生した可能性があります。

test.cpp:15: エラー: 'const testing' を 'int testing::test()' の 'this' 引数として渡すと、修飾子が破棄されます

どうもありがとう!

4

5 に答える 5

69

問題は、からオブジェクトの非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 {
    // ...
}
于 2009-02-15T06:45:27.047 に答える
5

メンバー関数 test1 の定義により、次のようになります。

int testing::test1(const testing& test2){
   test2.test();
   return 1;
}

変数 test2 の const 参照を渡しています。

つまり、test2 のメンバーを変更することはできず、const または static ではないメンバー関数を呼び出すことはできません。

修正方法は次のとおりです。

int testing::test() const {
   return 1;
}

最後の追加の const は、現在のオブジェクトのコンテンツを変更する予定がないことをコンパイラに伝えます (変更すると、別のコンパイル エラーが発生します)。

于 2009-02-15T07:02:28.267 に答える
2

行: test2.test()

test2 は const 参照ですが、非 const 関数を呼び出しています。それが問題です。これは、testing::test を const 関数にすることで修正できます。

于 2009-02-15T06:46:24.437 に答える
1

testing::test1(const testing& test2) は、渡されたオブジェクトが const であることを期待しており、その変数の値を変更したり、const として明示的に定義されていないメソッドにアクセスしたりすると、エラーが発生します。

test() メソッドは実際にはデータを変更しないため、次のように const に設定することをお勧めします。

class testing{
   int test() const;
   int test1(const testing& test2);
};

int testing::test() const {
   return 1;
}

または、test1() の引数を定義するときに const という単語を削除するだけで、渡されたオブジェクトの任意のメソッドに自由にアクセスできるようになります。

于 2009-02-15T07:11:54.987 に答える
-1

手早く汚れた解決策を-fpermissive得るには、コンパイラ自体が頻繁に提案する方法でコンパイルしてみてください (これは、Windows ユーザーがこの問題を報告することはめったにないため、おそらく VisualStudio コンパイラが行うことです)。

于 2015-05-26T14:18:58.513 に答える