gcc は "修飾語を破棄する [-fpermissive]" でコンパイルします。
2022-02-15 02:54:17
struct Base
{
Base() { std::cout << " Base::Base()\n"; }
virtual ~Base() { std::cout << " Base::~Base()\n"; }
virtual void test() { std::cout << " test in base\n"; }
};
void MyTest(const Base& b)
{
b.test();
}
以下のようなエラーでコンパイルします。
error: 'virtual void Base::test() ' の 'this' 引数として 'const Base' を渡すと修飾子 [-fpermissive] が破棄されます。
回避策
1. Base で test を宣言するときに const を追加する。
void test() const
2. MyTest の引数の前にある const 修飾子を削除します。
理由
C++では、const修飾された引数で参照されるオブジェクトは、そのオブジェクトのconst関数にしかアクセスできません。他の関数を呼ぶと、そのオブジェクトのメンバーを変更する可能性があり、コンパイラはそのようなことを避けるために非const関数を呼ぶのは間違いであると判断するためです。
関連
-
[解決済み】 unsigned int vs. size_t
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】CLionで、ヘッダのみのライブラリ:ファイル "どのプロジェクトターゲットにも属していない、コードインサイト機能が正しく動作しない可能性がある" の件
-
[解決済み】Ws2_32.libは実際にリンクする必要があるのでしょうか?
-
[解決済み] Arduinoのベクター
-
[解決済み] "戻り値の型が関数の型と一致しない "などのVSコンパイルエラーが発生する。
-
[解決済み] no matching function ifstream error を修正する方法は?重複
-
[解決済み] C++ Visual Studio 「非標準の構文。メンバへのポインタを作成するには '&' を使用」 [終了しました]
-
[解決済み] C++エラー:ステートメントがオーバーロードされた関数のアドレスを解決できない
-
[解決済み] CString.Replace 複数文字の置き換え
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み] 'char' から 'const char *' への変換が無効です。
-
[解決済み】glm::lookAt()を理解する)
-
[解決済み] Randomがスコープで宣言されていない
-
error: lvalue required as left operand of assignment
-
[解決済み] 非静的メンバ関数の無効な使用 c++
-
[解決済み] c++でデストラクタへの未定義参照エラー?
-
[解決済み] C++のユーザー入力待ち [重複]。
-
[解決済み] direct.h ドキュメント
-
C++における1e9(初期化、無限大)の説明