3

何が起こっている?

#include "MyClass.h"

class MyOtherClass {
  public:
    MyOtherClass();
    ~MyOtherClass();

    MyClass myVar; //Unknown type Error
};

突然、.h をインクルードしてその var Xcode を書き込むと、大量のエラーが発生します... また、不明な型のエラーも発生します。

.h がすぐそこに含まれているのにどうしてわからないのでしょうか?

例の MyClass.h に対応する NodeButton.h ファイルを次に示します。

#pragma once

#include "cinder/Vector.h"
#include "cinder/gl/gl.h"
#include "cinder/gl/Texture.h"
#include "cinder/Color.h"
#include "cinder/ImageIo.h"
#include "cinder/Timeline.h"
#include "cinder/app/AppBasic.h"
#include "cinder/App/App.h"

#include "Node.h"
#include "CursorMano.h"

using namespace ci;
using namespace ci::app;
using namespace std;
using namespace is;

typedef boost::shared_ptr<class NodeButton> NodeButtonRef;


class NodeButton  : public Node2D 
{
    public:
        NodeButton (CursorMano *cursor, string imageUrl, bool fadeIn = false, float delay = 0.0f);
        virtual ~NodeButton ();

        //methods
        void update( double elapsed );
        void draw();
        void setup();

        //events
        bool mouseMove( ci::app::MouseEvent event );

        //vars
        CursorMano      *mCursor;
        gl::Texture     mImageTexture;
        Anim<float>     mAlpha = 1.0f;
        bool            mSelected = false;

    private:
};

そして、ここに例の MyOtherClass.h に対応する CursorMano.h の内容があります。

#pragma once

#include <list>
#include <vector>

#include "cinder/app/AppBasic.h"
#include "cinder/qtime/QuickTime.h"
#include "cinder/gl/Texture.h"
#include "cinder/Vector.h"

#include "NodeButton.h"

using namespace ci;
using namespace ci::app;
using namespace std;

class CursorMano {
    public:
        CursorMano (AppBasic *app);
        ~CursorMano ();

        void    mueveMano(Vec2i);
        void    update();
        void    draw();
        void    play(int button);
        void    reset(int button);

        Vec2i   mMousePos;
        NodeButton                  mButtonCaller; //this gives the unknow type error

    private:
        AppBasic                    *mApp;
        gl::Texture                 mFrameTexture;
        qtime::MovieGl              mMovie;
        int                         mIdButton;
};
4

2 に答える 2

7

ヘッダーファイルには循環依存関係があります。

NodeButton.hコンパイラがの定義を見ることができるように含める必要がNodeButtonあるクラスを定義しますが、それ自体はを含みます。CursorMano.hNodeButtonNodeButton.hCursorMano.h

この循環依存を解消するには、前方宣言を使用する必要があります。

NodeButton.hポインタを使用するだけなので、名前空間宣言を使用した後にクラスを前方宣言するだけCursorManoを含める必要はありません。CursorMano.h

using namespace std;
using namespace is;

class CursorMano;
于 2012-02-07T05:33:48.493 に答える
1

これはおそらく、2 つのヘッダー ファイル ( NodeButtonincludesCursorManoCursorManoincludes NodeButton) 間の循環依存関係の結果です。#include "CursorMano.h"NodeButton.hの を削除してclass CursorMano;、宣言の前に追加してみてくださいNodeButton

于 2012-02-07T05:40:54.443 に答える