ошибка неизвестного типа в C ++ - PullRequest
3 голосов
/ 07 февраля 2012

Что происходит?

#include "MyClass.h"

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

    MyClass myVar; //Unknown type Error
};

Внезапно, когда я включаю .h и пишу, что var Xcode дает мне массу ошибок ... а также неизвестную ошибку типа.

Как это может быть неизвестно, когда .h включен прямо там?

Вот файл NodeButton.h, который будет соответствовать MyClass.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:
};

И вотсодержимое CursorMano.h, которое будет соответствовать MyOtherClass.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;
};

Ответы [ 2 ]

7 голосов
/ 07 февраля 2012

У вас есть круговая зависимость ваших заголовочных файлов.

NodeButton.h определяет NodeButton класс, который CursorMano.h должен включать, чтобы компилятор мог видеть определение для NodeButton, но NodeButton.h сам включает CursorMano.h.

Вам нужно будет использовать предварительные объявления, чтобы разорвать эту циклическую зависимость.

В NodeButton.h вы просто используете указатель на CursorMano, поэтому вам не нужно включать CursorMano.h просто объявить класс вперед после объявлений с использованием пространства имен.

using namespace std;
using namespace is;

class CursorMano;
1 голос
/ 07 февраля 2012

Это, вероятно, результат циклической зависимости между вами двумя заголовочными файлами (NodeButton включает CursorMano и CursorMano включает NodeButton).Попробуйте удалить #include "CursorMano.h" в NodeButton.h и добавить class CursorMano; перед объявлением NodeButton.

...