ホームページ > バックエンド開発 > C++ > なぜ「Foo foo2();」なのか「非クラス型のメンバーの要求」エラーが発生しますか?

なぜ「Foo foo2();」なのか「非クラス型のメンバーの要求」エラーが発生しますか?

Barbara Streisand
リリース: 2024-12-01 01:22:11
オリジナル
472 人が閲覧しました

Why Does

コンストラクター呼び出しエラー: 「非クラス型のメンバーのリクエスト」について

特定のコンストラクター パラメーターを使用してオブジェクトをインスタンス化するときに、プログラマが遭遇する可能性があるエラー「非クラス型である '..' のメンバー '..' を要求します。」このエラーを効果的に解決するには、このエラーの原因を理解することが重要です。

提供されているコード例は、問題を示しています。クラス Foo には 2 つのコンストラクターがあります。引数のないデフォルトのコンストラクターと、単一の整数パラメーターを受け入れるコンストラクターです。意図どおりにパラメーター化されたコンストラクター関数を使用して foo1 をインスタンス化します。ただし、デフォルトのコンストラクターを呼び出すとコンパイル エラーが発生します。

これはなぜ発生しますか?構文

Foo foo2();
ログイン後にコピー

は、それ自体を関数宣言として誤解します。コンパイラーは、これを、戻り値の型が Foo である foo2 という名前の関数を宣言していると認識し、括弧に基づく引数を期待します。ただし、目的は、引数をとらないデフォルトのコンストラクターを使用して foo2 という名前のオブジェクトをインスタンス化することです。

その結果、コンパイラーは foo2 を Foo() という名前の非クラス型として指定します。この指定により、Foo クラス内で定義されたメソッドへのアクセスが妨げられるため、foo2.bar() の呼び出しが無効になります。

このエラーを修正するには、構文を次のように調整する必要があります。

Foo foo2;
ログイン後にコピー

括弧を省略すると、コンパイラは

Foo foo2
ログイン後にコピー

を foo2 のオブジェクト宣言として解釈します。デフォルトのコンストラクターを使用します。これにより、Foo 型のオブジェクトが正常にインスタンス化され、bar() などのそのメンバー関数にアクセスできるようになります。

以上がなぜ「Foo foo2();」なのか「非クラス型のメンバーの要求」エラーが発生しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート