2012-02-07 2 views
3

무슨 일이 일어나고 있습니까?C++에서 알 수없는 유형 오류

#include "MyClass.h" 

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

    MyClass myVar; //Unknown type Error 
}; 

갑자기 .h를 포함하고 var Xcode를 작성하면 오류가 발생하고 ... 알 수없는 유형 오류가 발생합니다.

.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: 
}; 

의에서 MyClass.h에 해당 그리고 여기의 예에서 MyOtherClass.h에 해당 할 CursorMano.h의 내용이있는 것 NodeButton.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

'MyClass.h'의 내용은 무엇입니까? 또한 MyOtherClass와 그 ctor-dtor의 철자가 일치하지 않습니다! – iammilind

+0

'MyClass.h'를 보여줄 수 있습니까? – birryree

+0

더 많은 코드가 필요합니다. MyClass.h의 전체 내용과이 헤더의 전체 내용을 보여줄 수 있습니까? – templatetypedef

답변

7

헤더 파일의 순환 의존성이 있습니다.

NodeButton.hCursorMano.h은 그래서 컴파일러는 NodeButton하지만 NodeButton.h 자체 CursorMano.h을 포함에 대한 정의를 볼 수 있습니다 포함해야 NodeButton 클래스를 정의합니다.

이 순환 종속성을 손상 시키려면 전달 선언을 사용해야합니다.

NodeButton.h에서 포인터는 CursorMano에 불과하므로 CursorMano.h을 포함 할 필요가 없습니다. 사용 네임 스페이스 선언 다음에 클래스를 선언하십시오.

using namespace std; 
using namespace is; 

class CursorMano; 
+0

좋아,하지만 어떻게하면 두 클래스를 서로 참조 할 수 있습니까? – Pier

+1

@Pier : NodeButton.h의'CursorMano' (전달'클래스 CursorMano;')를 전달하고 NodeButton.h에서'#include "CursorMano.h"를 제거합니다. – Mankarse

+0

아, 내 대답을 타이핑 할 때와 마찬가지로 :) – kevintodisco

1

아마 두 헤더 파일 사이의 순환 종속성 (NodeButtonCursorMano 포함 CursorManoNodeButton 포함)의 결과입니다. NodeButton.h에서 #include "CursorMano.h"을 제거하고 선언 앞에 class CursorMano;을 추가하십시오.