1

以下に、コンパイル時にエラーが発生するコードの一部の簡略版を再現しました。

tests.cpp

#include <iostream>
#include "../Beta.h"
#include "../Alpha.h"

using namespace std;

int main() {
    cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
    return 0;
}

Alpha.h

#include <vector>

class Alpha
{
    public:

        typedef struct _info{
            int  k;
        } info;

        friend class Beta;
};

Beta.h

   #include <vector>
    
        class Alpha;
        
        class Beta
        {
            public:
            std::vector <Alpha::info*> vecInfo;
        };

実行するg++ testing.cppと、以下のエラーメッセージが表示されます

tests.cpp:10:0から含まれているファイル:../ Beta.h:8:15:エラー:

ネストされた名前指定子で使用される不完全なタイプ「アルファ」../Beta.h:8:15:

エラー:ネストされた名前指定子で使用される不完全なタイプ「アルファ」

../Beta.h:8:27:エラー:テンプレート引数1が無効です../Beta.h:8:27:

エラー:テンプレート引数2が無効です

フォーラムのスレッドから、最初のエラーはある種の循環依存が原因であることがわかります(エラー:ネストされた名前指定子で使用される不完全な型)。私のコードと彼らのコードの類似性を見ることができません。私は何を間違っているのですか。

4

2 に答える 2

5

これは実際には循環依存ではありません。 前方宣言の代わりにBeta.hする必要があります。#include "Alpha.h"class Alpha;

于 2013-02-15T17:44:54.313 に答える
3

にアクセスするには完全なクラス定義が必要なので、Alpha.hに含める必要があります。が含まれていないため、これによって循環依存関係が作成されることはありません。Beta.hAlpha::infoAlpha.hBeta.h

// don't forget the include guards!
#ifndef BETA_H_
#define BETA_H_

#include <vector>
#include "../Alpha.h"

class Beta
{
    public:
    std::vector <Alpha::info*> vecInfo;
};

#endif
于 2013-02-15T17:45:11.310 に答える