ホームページ > バックエンド開発 > C++ > C++ コードの「エラー: 不完全な型は許可されません」の問題を解決する

C++ コードの「エラー: 不完全な型は許可されません」の問題を解決する

王林
リリース: 2023-08-26 20:54:35
オリジナル
1962 人が閲覧しました

解决C++代码中出现的“error: incomplete type is not allowed”问题

C コードの「エラー: 不完全な型は許可されません」問題を解決する

C プログラミングの過程で、コンパイル エラーが発生することがあります。一般的なエラーは「エラー: 不完全な型は許可されません」です。このエラーは通常、不完全な型を操作することによって発生します。この記事では、このエラーの原因を説明し、いくつかの解決策を提供します。

まず、このエラーを引き起こすサンプル コードを見てみましょう:

#include <iostream>

class A;
class B {
public:
    void foo(A& a) {
        std::cout << "foo function" << std::endl;
    }
};

class A {
public:
    void bar(B& b) {
        b.foo(*this);
    }
};

int main() {
    A a;
    B b;
    a.bar(b);
    return 0;
}
ログイン後にコピー

このサンプル コードでは、2 つのクラス A と B を定義します。クラス A にはメンバー関数 bar があります。この関数のパラメータの型は B への参照であり、クラス B にはメンバ関数 foo があり、この関数のパラメータの型は A への参照です。 main 関数では、クラス A オブジェクト a とクラス B オブジェクト b を作成し、次に b をパラメーターとして渡して a の bar 関数を呼び出します。

ただし、このコードをコンパイルしようとすると、次のエラー メッセージが表示されます:

error: incomplete type 'A' used in nested name specifier
ログイン後にコピー

このエラーは、コンパイラがコンパイル時にクラス A の完全な定義を判断できないことが原因です。このコードが原因です。クラス A の存在はクラス B を定義するときにのみ宣言されますが、クラス A の完全な定義は提供されないため、コンパイラはクラス A のメンバー関数とメンバー変数の具体的な実装を判断できず、コンパイル エラーが発生します。

この問題を解決するには、いくつかの方法を試してください。

最初の方法は、このクラスが使用される場所の前にクラスの定義を配置することです。次のように、クラス B の定義をクラス A の定義と入れ替えることができます。

class A {
public:
    void bar(B& b);
};

class B {
public:
    void foo(A& a) {
        std::cout << "foo function" << std::endl;
    }
};

void A::bar(B& b) {
    b.foo(*this);
}
ログイン後にコピー

クラス B の定義をクラス A の定義の前に置くことで、コンパイラは完全な定義を見つけてコンパイル エラーを解決できます。 。

もう 1 つのアプローチは、前方宣言を使用することです。以下に示すように、クラスの宣言の前にキーワード「class」を使用して、前方宣言を行うことができます。

class A;
class B {
public:
    void foo(A& a) {
        std::cout << "foo function" << std::endl;
    }
};

class A {
public:
    void bar(B& b);
};

void A::bar(B& b) {
    b.foo(*this);
}
ログイン後にコピー

前方宣言を使用することで、A という名前のクラスが存在することをコンパイラーに伝えますが、クラスの具体的な定義は、コードの後半で提供されます。このようにして、コンパイラは前方宣言を通じてクラス A の情報を取得することができ、コンパイル エラーを解決できます。

最後の方法は、クラスの定義をヘッダー ファイルに置き、このクラスを使用する必要があるファイルにヘッダー ファイルをインクルードすることです。たとえば、以下に示すように、クラス A とクラス B の定義を 2 つのヘッダー ファイル「aclass.h」と「bclass.h」にそれぞれ配置し、これら 2 つのクラスを使用するファイルに対応するヘッダー ファイルを含めることができます。 :

「aclass.h」ファイル内:

#ifndef ACLASS_H
#define ACLASS_H

class B;

class A {
public:
    void bar(B& b);
};

#endif
ログイン後にコピー

「bclass.h」ファイル内:

#ifndef BCLASS_H
#define BCLASS_H

#include <iostream>
#include "aclass.h"

class B {
public:
    void foo(A& a) {
        std::cout << "foo function" << std::endl;
    }
};

#endif
ログイン後にコピー

これら 2 つのクラスを使用するファイルでは、 #include ディレクティブは、対応するヘッダー ファイルをインクルードし、次のようにこれら 2 つのクラスを使用します。

#include "aclass.h"
#include "bclass.h"

int main() {
    A a;
    B b;
    a.bar(b);
    return 0;
}
ログイン後にコピー

クラスの定義をヘッダー ファイルに配置し、このクラス ファイルを使用するファイルに対応するヘッダーをインクルードすることで、次のことが可能になります。これら 2 つのクラスを使用する必要があるファイル内でこれら 2 つのクラスを正しく使用すると、コンパイル エラーが解決されます。

要約すると、C コードで「エラー: 不完全な型は許可されていません」というエラーが発生した場合、このクラスが使用される場所の前にクラスの定義を配置することで、前方宣言を使用できます。この問題を解決するには、ヘッダー ファイルにクラスの定義を記述します。これらの方法は、不完全な型を正しく使用してこのコンパイル エラーを回避するのに役立ちます。

以上がC++ コードの「エラー: 不完全な型は許可されません」の問題を解決するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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